原题:1070. Mooncake (25)
解题思路:
贪心。每次挑单价最高的即可。注意质量用double保存,不然第三个样例过不去。
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
struct MC
{
double price;
double amt;
bool operator < (const MC& rhs)
{
return price / amt > rhs.price / rhs.amt;
}
} mooncake[maxn];
int main()
{
int n;
double m;
while(scanf("%d %lf", &n, &m) == 2)
{
for(int i = 0; i < n; i++) scanf("%lf", &mooncake[i].amt);
for(int i = 0; i < n; i++) scanf("%lf", &mooncake[i].price);
sort(mooncake, mooncake + n);
double ans = 0;
int idx = 0;
while(m > 0 && idx < n)
{
if(m >= mooncake[idx].amt)
{
m -= mooncake[idx].amt;
ans += mooncake[idx].price;
}
else
{
ans += mooncake[idx].price / mooncake[idx].amt * m;
m = 0;
}
idx++;
}
printf("%.2f\n", ans);
}
return 0;
}