题目描述
给定所有种类月饼的库存量、总售价以及市场的最大需求量,计算可以获得的最大收益。假如:有三种月饼,库存分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场需求量为20万吨,最大收益应该为卖出全部15万吨第二种月饼以及5万吨第三种月饼,获利72+45/2=94.5亿元。
输入样例
3 20 //三种月饼,市场最大需求量20
18 15 10 //各自库存
75 72 45 //各自总售价
输出样例
94.50
思路
1.总是选择单价最高的月饼售出。
2.判断单价最高的月饼的库存是否大于市场需求;若大于市场需求,则最重获利为市场需求量*最高单价;若小于,则最重获利为单价最高种类月饼的总售价与(市场需求量-单价最高月饼的总库存)乘以单价第二高的月饼的单价,依次判断。
#include<cstdio>
#include<algorithm>
using namespace std;
struct mooncake{
double store; //库存
double sell; //总售价
double price; //单价
}cake[1010]; //存放月饼种类的数组
bool cmp(mooncake a,mooncake b){
return a.price > b.price ;
}
int main(){
int N; //月饼类别
double D;//市场需求量
scanf("%d%lf",&N,&D);
for(int i = 0;i<N;i++){
scanf("%lf",&cake[i].store);
}
for(int i=0;i<N;i++){
scanf("%lf",&cake[i].sell );
cake[i].price = cake[i].sell / cake[i].store ;
}
sort(cake,cake+N,cmp); //按单价从高到低排序
double ans = 0; //收益
for(int i=0;i<N;i++){
if(cake[i].store <= D){
ans = ans + cake[i].sell ;
D = D - cake[i].store ;
}else{
ans = ans + cake[i].price * D;
break;
}
}
printf("%.2f\n",ans);
return 0;
}
按单价进行排序,积累这种解题的思路,以后遇到类似的题目,采用这种思路。