PAT 乙级 1020.月饼 C++/Java

题目来源

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

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

            然后再从单价第二大的计算收益,

            最大收益 = 所有月饼收益

 注意:库存用double类型,用int的话测试点2过不去

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 }

 

Java实现:

 

posted @ 2019-10-10 22:46  47的菠萝~  阅读(204)  评论(0编辑  收藏  举报