【练习】PAT 乙 1020 月饼
题目
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 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
来源:PAT 乙 1020 月饼
思路(注意事项)
测试点3:漏掉了一种可能的情况→如果所有月饼的总量都不能满足需求量,则最大利润就是所有月饼的总售价。
题解
#include<bits/stdc++.h>
using namespace std;
// 定义月饼结构体
struct yuebing
{
float k, s, d; // k 库存量 s 总售价 d 单价
};
// 比较函数:按单价从高到低排序
bool comp(yuebing a, yuebing b)
{
return a.d > b.d;
}
int main()
{
int z, x; // z: 种类,x: 需求量
cin >> z >> x; // 输入月饼种类数和需求量
// 定义月饼数组
vector<yuebing> y(z);
// 输入每种月饼的库存量
for (int i = 0; i < z; i++) cin >> y[i].k;
// 输入每种月饼的总售价
for (int i = 0; i < z; i++) cin >> y[i].s;
// 计算每种月饼的单价
for (int i = 0; i < z; i++) y[i].d = y[i].s / y[i].k;
// 按单价从高到低排序
sort(y.begin(), y.end(), comp);
float sum = 0; // 最大收益
int i = 0; // 当前处理的月饼索引
// 循环选择月饼,直到满足需求量 x
while (x != 0)
{
// 如果当前月饼的库存量 <= 需求量
if (x >= y[i].k)
{
sum += y[i].s; // 将当前月饼的总售价加入收益
x -= y[i].k; // 减少需求量
}
// 如果当前月饼的库存量 > 需求量
else
{
sum += x * y[i].d; // 按需求量 x 计算部分售价
break; // 结束循环
}
// 移动到下一个月饼
if (i < z - 1)
i++;
else
break; // 如果所有月饼都已处理,结束循环
}
// 输出最大收益,保留两位小数
printf("%.2f", sum);
return 0;
}