题目内容:
现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,
其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。
输入描述:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、
以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。
随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);
最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出描述:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:
3 20 18 15 10 75 72 45
输出样例:
94.50
分析
ni:对第i种月饼需求的月饼数量 ; wi:月第i种饼单价 (W[i] / M[i]) :
总收益: W = n1*w1 + n2*w2 + n3*w3+ …;
市场需求:D = n1 + n2 + …; (假如以n1、n2、n3…的顺序需求)
要使得W最大,肯定是首先取单价最大的尽可能多,所以:
首先计算每种月饼单价,并进行排序
然后满足市场需求条件取月饼
AC的渣渣代码:
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int Max = 1010;
struct Node{
double stock; //月饼库存
double tsp; //月饼总售价 total sale price
double price; //月饼单价
};
Node mooncake[Max];
int N, D;
bool cmp(Node a, Node b){
return a.price > b.price;
}
int main(){
int i;
double W = 0.0; //收益
cin >> N >> D;
for(i = 0; i < N; i ++)
cin>>mooncake[i].stock;
for(i = 0;i < N; i ++){
cin>>mooncake[i].tsp;
mooncake[i].price = mooncake[i].tsp / mooncake[i].stock;
}
sort(mooncake, mooncake+N, cmp);
/*
//用while的写法稍微复杂,i有自增、有范围还是用for简单方便QAQ
i = 0;
while(D && i < N){ //此处注意控制i的范围!
//如果该种月饼总库存比市场需求D小,则可全要
if(mooncake[i].stock <= D){
W += mooncake[i].tsp;
D -= mooncake[i].stock;
i ++;
}
//如果该月饼总库存比市场需求D大,则只要剩下的市场需求D的量
else if(mooncake[i].stock > D && D > 0){
W += mooncake[i].price * D * 1.0;
D -= D;
i ++;
}
}
*/
for(i = 0; i < N; i ++){
if ( D >= mooncake[i].stock ) {
W += mooncake[i].tsp;
D -= mooncake[i].stock;
}
else if ( D < mooncake[i].stock && D > 0 ) {
W += D * 1.0 * mooncake[i].price;
D -= mooncake[i].stock;
}
else
break;
}
//控制结果保留2位小数
cout<<fixed<<setprecision(2)<<W;
return 0;
}