月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。
输入样例:
3 20 18 15 10 75 72 45
分析:
这道题要求的是最大收益,给出月饼的种类和市场需求量,再给出它们的库存和总售价。
首先求出不同月饼的单价,先计算单价最高的月饼(假定A的单价最大)
用一个结构体保存月饼的信息:月饼库存,总售价,单价
按照单价高低对月饼信息进行排序,得到单价最高的月饼
情况1:A类月饼总库存 > 市场最大需求量N,则最大收益 = A的单价 * 市场最大需求量
情况2:A类月饼库存 < 市场最大需求量, 则A的收益 = A的单价 * 市场最大需求量
新的市场最大需求 = 市场最大需求量 减去 A的库存
然后再从单价第二大的计算收益,
最大收益 = 所有月饼收益
C++实现:
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <cctype> 5 #include <vector> 6 #include <stack> 7 #include <climits> 8 #include <cstdio> 9 #include <numeric> 10 using namespace std; 11 12 typedef struct MoonCake { 13 double store; //月饼库存 14 double sell; //总售价 15 double unitPrice; //单价 16 }MoonCake; 17 18 bool myCmp(MoonCake a, MoonCake b) 19 { 20 return a.unitPrice > b.unitPrice; 21 } 22 23 int main() 24 { 25 int N; //月饼种类数 26 double D; //市场最大需求量 27 double result = 0; 28 cin >> N >> D; 29 vector<MoonCake> vecMoon(N); 30 for (int i = 0; i < N; ++i) 31 { 32 cin >> vecMoon[i].store; 33 } 34 for (int i = 0; i < N; ++i) 35 { 36 cin >> vecMoon[i].sell; 37 vecMoon[i].unitPrice = vecMoon[i].sell / vecMoon[i].store; 38 } 39 //按照单价高低排序 40 sort(vecMoon.begin(), vecMoon.end(), myCmp); 41 for (int i = 0; i < N; ++i) 42 { 43 if (vecMoon[i].store <= D) 44 { 45 //该种类月饼的库存小于市场最大需求 46 result = result + vecMoon[i].sell; 47 } 48 else 49 { 50 //库存大于市场需求 51 result = result + vecMoon[i].unitPrice * D; 52 break; 53 } 54 D = D - vecMoon[i].store; 55 } 56 printf("%0.2lf", result); 57 return 0; 58 }