月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 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
输出样例:
94.50
思路:结构体月饼,成员变量包括月饼的总价,单价,数量。
查了一下,因为是给定市场最大需求量,根据月饼的利润,先卖贵的保证利润最大,应属于贪心算法。
参考了小泰格儿的博文,表示感谢。我使用的C++嗯,代码如下:
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 using namespace std; 5 6 //输入样例: 7 //3 20 8 //18 15 10 9 //75 72 45 10 //输出样例: 11 //94.50 12 typedef struct MoonCake 13 { 14 float price;//月饼总价 15 float num;//月饼数量 16 float iprice;//月饼单价 17 }MoonCake; 18 MoonCake mc[1001];//全局变量1001个月饼种类 19 20 bool cmp(MoonCake a,MoonCake b)//用于sort递减排序 21 { 22 return a.iprice>b.iprice; 23 } 24 25 int main() 26 { 27 int n,need;//N表示月饼的种类,need表示市场需求 28 float ans=0;//ans表示答案,即实际利润 29 cin>>n>>need;//用户输入月饼种类,市场需求//3 20 30 for(int i=0;i<n;i++) 31 { 32 cin>>mc[i].num;//用户输入每种月饼的数量 33 } 34 for(int i=0;i<n;i++) 35 { 36 cin>>mc[i].price;//用户输入每种月饼的总价 37 mc[i].iprice=mc[i].price/mc[i].num;//浮点数计算每种月饼的单价 38 } 39 sort(mc,mc+n,cmp);//使用sort函数进行排序需要<algorithm>头文件 40 for(int i=0;i<n;i++) 41 { 42 if(mc[i].num<need)//如果市场需求大于月饼数量 43 { 44 ans+=mc[i].price;//加上总价 45 need-=mc[i].num;//减去数量 46 }else{//如果市场需求小于等于月饼数量 47 ans+=mc[i].iprice*need;//加上单价*市场需求 48 break;//循环结束 49 } 50 } 51 printf("%.2f",ans);//保留两位有效数字输出结果 52 return 0; 53 }