1020 月饼 (25 分)

题目:1020 月饼 (25 分)

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 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

思路:

  • 题目讲得看上去有点复杂,实际上思路很简单。
  1. 首先先好好读题,除了种类数n和市场最大需求量d说明是正整数外其他都是正数对正数!不是正整数!!所以除了n和d外要全部设成浮点型,float或double。
  2. 看到这题要达到最大收益首先想到的就是单价高的先卖。所以先根据库存量和总售价出每个种类单价,然后对算出的单价进行降序排序。把单价大的总售价逐个求和,再判断该种类有没有卖完,若没有卖完减去多算的部分的钱,多算的钱就是没卖完剩下的库存的单价*剩下的库存

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <sstream>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <string>
 8 #include <stack>
 9 #include <queue>
10 #include <vector>
11 #include <map>
12 using namespace std;
13 
14 struct mooncake{
15     double storage;
16     double tprice;
17     double mcp; //单价 
18 }mc[1005];
19 
20 bool cmp(mooncake a, mooncake b)
21 {
22     return a.mcp > b.mcp; 
23 }
24 
25 int main()
26 {
27     int n,d;
28     double sum = 0;
29     double ans = 0;
30     scanf("%d%d", &n, &d);
31     for(int i = 0; i < n; i++)
32         scanf("%lf", &mc[i].storage);
33     for(int i = 0; i < n; i++)
34         scanf("%lf", &mc[i].tprice);
35     for(int i = 0; i < n; i++)
36     {
37         mc[i].mcp = mc[i].tprice / mc[i].storage;
38     }
39     sort(mc, mc + n, cmp);
40     for(int i = 0; i < n; i++)
41     {
42         ans += mc[i].storage;
43 //        printf("ans = %lf\n", ans);
44         sum += mc[i].tprice;
45 //        printf("sum = %.2lf\n", sum);    
46         if(ans > d)
47         {
48             sum = sum - mc[i].mcp * (ans - d);
49 //            printf("cha = %.2lf\n", ans - d);
50 //            printf("sumflag = %.2lf\n", sum);
51             break;
52         }
53     }
54     printf("%.2lf\n", sum);
55     return 0;
56 }

 

总结:

  第一个代码只设了一个最大收益的变量类型为double,后来一看题发现,除了种类数n和市场最大需求量d说明是正整数外其他都是正数对正数!不是正整数!!于是就把其他变量重新设成了浮点型double,然而输入类型居然忘记改了!!发现后当场吐血身亡。。就因为这样测试程序的时候发现sum错的很离谱啊,还以为是下面的思路和代码实现哪里错了,调试了半天,一直纳闷,感觉对的很……直到后来看向输入函数……谁知我这么菜,思维这么弱,考虑的还不全面,很弱智就是了,感觉自己像极了酸菜鱼T^T。

  以上说明了一点,思维模式偏弱、超级弱QAQ,及编程序时搭框架的锻炼还是不够,不管怎样,加油吧QAQ。

posted @ 2019-07-25 21:37  Anzer  阅读(576)  评论(0编辑  收藏  举报