题目链接在此。
思路
使用“总是选择单价最高的月饼出售”这一策略可以使得收益最大。
首先,根据输入,得到每种月饼的单价,然后按照单价从高到低对月饼排序。
然后枚举每种月饼,当总需求量大于等于该种月饼的库存的时候,总需求量减去该月饼的库存量,所获得的利润加上该月饼总价;当总需求量小鱼该种月饼的库存的时候,之取需求量大小的月饼量,此时需求量减为0,利润加上需求量乘以该种月饼单价。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct INFO{
double stock; //库存
double whole; //总售价
double price; //单价
}cake[1010];
bool cmp(INFO a, INFO b){
return a.price > b.price;
}
int main(){
int N;
double D;
scanf("%d %lf",&N,&D);
double temp;
for(int i = 0; i < N; i++){
scanf("%lf ",&temp);
cake[i].stock = temp;
}
for(int i = 0; i < N; i++){
scanf("%lf", &temp);
cake[i].whole = temp;
cake[i].price = cake[i].whole / cake[i].stock; //计算单价
}
//根据单价从高到低排序
sort(cake,cake+N,cmp);
double w = 0.0; //总盈利
double sum = 0; //卖出数量
for(int i = 0; i < N; i++){
if(cake[i].stock+sum <= D){ //可以把i月饼都卖掉
w += cake[i].whole;
sum += cake[i].stock;
}else{ //只能卖掉i月饼的一部分
double need = D-sum;
w += need * cake[i].price;
break;
}
}
printf("%.2f\n",w);
return 0;
}