[PAT-A 1070]Mooncake

在这里插入图片描述
题目大意:
现有月饼需求量为D,已知n种月饼各自的库存量和总售价,问如何销售这些月饼可以获得的收益最大,求最大收益。

思路:
1)总是选择最高价的月饼出售,就可以获得最大的利润,因此对每种月饼,都根据其库存总量个总售价来计算该种月饼的单价,将所有月饼按单价由高到低排序。
2)从单价高的月饼开始枚举,如果该月饼的库存量不足以填补所有需求量,则将该种月饼全部卖出,此时需求量减少该种月饼的库存量大小,收益值增加该种月饼的总售价大小。
如果该种月饼的库存量足够供应需求量,则只需提供需求量大小的月饼,此时收益值增加当前需求量乘以该种月饼的单价,而需求量减少为0。

贪心策略正确性的证明:
假设有两种单价不同的月饼,其单价分别为a和b,如果当前需求量为k,那么两种月饼总收入为aK和bK,而aK<bK显然成立。

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct mooncake {
	double store;
	double sell;
	double price;
}cake[1010];
bool cmp(mooncake a, mooncake b) {
	return a.price > b.price;
}
int main() {
	int n;
	double D;
	(void)scanf("%d%lf", &n, &D);
	for (int i = 0; i < n; i++) {
		(void)scanf("%lf", &cake[i].store);
	}
	for (int i = 0; i < n; i++) {
		(void)("%lf", &cake[i].sell);
		cake[i].price = cake[i].sell / cake[i].store;
	}
	sort(cake, cake + n, cmp);
	double ans = 0;
	for (int i = 0; i < n; i++) {
		if (cake[i].store <= D) {
			D -= cake[i].store;
			ans += cake[i].sell;
		}
		else {
			ans += cake[i].price * D;
			break;
		}
	}
	printf("%.2f\n", ans);
	return 0;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 2879

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104218812