题目
思路
贪心 +
结构体排序(或者用pair)
我实现了两种结构体排序,一是重载operator<
二是直接用lambda
函数
具体见代码
代码
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int N;
double w[1010], v, vpw, D;
// struct cake{
// double v, w, vpw;
// }cakes[1010];
struct cake{
double v, w, vpw;
bool operator<(const cake& c) const{
return vpw > c.vpw;
}
}cakes[1010];
int main(){
cin >> N >> D;
for (int i = 0; i < N; i ++) cin >>w[i];
for (int i = 0; i < N; i ++){
cin >> v;
vpw = v / w[i];
cakes[i] = {v, w[i], vpw};
}
// sort(cakes, cakes + N, [](const cake& c1, const cake& c2){
// return c1.vpw > c2.vpw;
// });
sort(cakes, cakes + N);
double money = 0;
for (int i = 0; i < N; i ++){ // 一开始for循环没有写终止条件,导致逻辑有一点瑕疵,无法通过全部测试样例
// for (int i = 0; ; i ++){
if (D >= cakes[i].w){
money += cakes[i].v;
D -= cakes[i].w;
}else {money += D * cakes[i].vpw; break;}
}
// cout << fixed << setprecision(2) << money << endl;
printf("%.2lf\n", money);
return 0;
}