C:L2-003 月饼 (25分)

该博客介绍了一道C语言编程题,题目涉及月饼销售策略,以求得最大收益。给定月饼种类、库存、总售价及市场需求量,需要计算最大收益。解题方法是计算每种月饼的单价,按单价降序排列,并根据市场需求量卖出月饼,确保收益最大化。代码实现中需要注意使用double类型处理浮点数精度。

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

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

解题思路:

先算出每种月饼的单价,然后按照单价从大到小冒泡排序,最后根据需求量按顺序“卖出”就行了

值得注意的是一些变量要定义成doube型 

代码如下:

#include<stdio.h>
int main() {
	int N;
	double D;
	scanf("%d %lf", &N, &D);
	double a[3][1001];//第一行存放月饼重量,第二行存放月饼总价,第三行存放月饼单价 
	int i, j;
	for (i = 0;i < N;i++
### L2-003 月饼问题解析 L2-003 月饼问题是经典的贪心算法应用案例之一。该问题的核心在于如何通过合理的销售策略最大化收益。 #### 贪心算法的应用 为了实现最大化的收益目标,可以采用如下方法:先计算每种月饼的单位价格(即总售价除以库存量),然后按照单位价格从高到低排序。接着依次尝试出售这些月饼,直到市场的需求完全被满足为止[^1]。 以下是具体的代码实现: ```cpp #include <bits/stdc++.h> using namespace std; struct Mooncake { double stock; // 库存量 double total; // 总售价 double price; // 单价 }; bool cmp(const Mooncake& a, const Mooncake& b) { return a.price > b.price; // 按单价从高到低排序 } int main() { int N, D; cin >> N >> D; vector<Mooncake> mooncakes(N); for (int i = 0; i < N; i++) { cin >> mooncakes[i].stock; } for (int i = 0; i < N; i++) { cin >> mooncakes[i].total; mooncakes[i].price = mooncakes[i].total / mooncakes[i].stock; // 计算单价 } sort(mooncakes.begin(), mooncakes.end(), cmp); double maxProfit = 0.0; // 最大收益 for (const auto& cake : mooncakes) { if (D <= 0) break; // 市场需求量已满足 double sell = min(cake.stock, (double)D); // 当前月饼的销售数量 maxProfit += sell * cake.price; // 累加收益 D -= sell; // 更新剩余需求量 } printf("%.2f\n", maxProfit); // 输出最大收益,保留两位小数 return 0; } ``` 上述 C++ 实现展示了如何利用结构体存储数据并按需排序,最终完成收益的最大化计算过程[^1]。 对于 Python 用户而言,也可以采取类似的逻辑来解决问题: ```python _, demand = map(int, input().split()) mooncakes = sorted( zip(map(float, input().split()), map(float, input().split())), key=lambda x: x[1] / x[0], reverse=True ) income = 0 for storage, price in mooncakes: if demand >= storage: demand -= storage income += price else: income += demand * (price / storage) break print(f"{income:.2f}") ``` 此段 Python 代码同样遵循了贪心原则,并且简洁高效地实现了题目要求的功能[^4]。 #### 关键点析 1. **输入处理** 输入部需要别读取库存量和对应总售价的数据,并据此计算出每种商品的单位价值以便后续操作[^2]。 2. **排序机制** 使用自定义比较器或者 `lambda` 表达式对所有商品依据其单位价值降序排列,从而优先考虑那些性价比更高的选项[^3]。 3. **动态调整需求变量** 在遍历过程中不断减少未满足的需求总量直至归零;同时累积所得利润作为最终结果的一部--- ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值