题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1070
/*
* 贪心问题
* 坑:数量为double。这样符合实际问题,但是题目给的示例及题目信息尾
* 表明为double。
*/
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
struct Mooncake
{
double price;
double left;
double per_price;
};
bool cmp(Mooncake a, Mooncake b)
{
// 按每份的价格排序,价格大者在前
return a.per_price > b.per_price;
}
vector<Mooncake> a;
int N;
double D;
int main()
{
scanf("%d%lf", &N, &D);
int i;
Mooncake t;
for(i=0; i<N; i++)
{
scanf("%lf", &t.left);
a.push_back(t);
}
for(i=0; i<N; i++)
{
double price;
scanf("%lf", &price);
a[i].price = price;
a[i].per_price = a[i].price / a[i].left;
}
sort(a.begin(), a.end(), cmp);
double profit = 0;
for(i=0; i<N && D>0; i++)
{
if(a[i].left >= D)
{
// 买不光
profit += D * a[i].per_price;
a[i].left -= D;
D = 0;
}
else
{
profit += a[i].price;
D = D - a[i].left;
a[i].left = 0;
}
}
printf("%.2lf\n", profit);
return 0;
}