贪心的从单价最高的开始买。注意正数不是正整数!!!
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 10;
struct Node
{
double price; // 单价
int id; //属于第几个物品
};
double c[N], w[N]; // 正数不是正整数
vector<Node> arr;
bool cmp(Node &a, Node &b)
{
//小数比较不能直接 !=,因为小数有误差,但是这题好像不这样写也可以
if(fabs(a.price - b.price) > 1e-6) return a.price > b.price;
return a.id > b.id;
}
int main()
{
double n, d;
cin >> n >> d;
for(int i = 1; i <= n; i ++) cin >> c[i];
for(int i = 1; i <= n; i ++) cin >> w[i];
for(int i = 1; i <= n; i ++)
{
double price = w[i] / c[i]; // 计算单价
arr.push_back({price, i});
}
double res = 0;
sort(arr.begin(), arr.end(), cmp); // 排序
for(int i = 0; i < arr.size(); i ++)
{
double price = arr[i].price;
int id = arr[i].id;
res += min(c[id], d) * price;
d -= min(c[id], d);
if(d <= 0) break;
}
printf("%.2lf", res);
return 0;
}