1020. 月饼 (25)
原创
©著作权归作者所有:来自51CTO博客作者wx57bda751de34e的原创作品,请联系作者获取转载授权,否则将追究法律责任
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:
3 20
18 15 10
75 72 45
输出样例:
94.50
//使用结构体来储存月饼的数据,然后使用sort来根据单价排位置,这个方法很是厉害啊
//使用容器vector来存放结构体。这就体现了是C++的思路,不是写C风格。vector也很好使
//sort排序,用好自定义的比较函数很方便,以前都没想过可以用结构体的一个元素对结构体进行排序
//对于这个题,要记住,除了种类,最大需求,其他的数都只保证是正的,不一定是整数
//最大需求可能大于所有月饼的库存
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct
{
double all;
double tpr;//totalprice
double spr;//singleprice
}moonCake;
bool compare(const moonCake &a,const moonCake &b)//必须是const,这里不是很理解
{
return a.spr>b.spr;
}
int main()
{
int kinds,need,cnt=0;
double answer=0;
cin >> kinds >> need;
vector<moonCake> vec(kinds);
for(int i=0;i<kinds;i++)
{
cin >> vec[i].all;
}
for(int i=0;i<kinds;i++)
{
cin >> vec[i].tpr;
vec[i].spr = vec[i].tpr/vec[i].all;
}
sort(vec.begin(),vec.end(),compare);
while((need>0)&&(cnt<kinds))
{
if (need>=vec[cnt].all)
{
answer+=vec[cnt].tpr;
need-=vec[cnt].all;
}else{
answer+=vec[cnt].spr*need;
need = 0;
}
cnt++;
}
cout << fixed << setprecision(2) <<answer<<endl;
return 0;
}