PAT 乙级 1020.月饼
2016-03-23 15:12
190 查看
1020.月饼
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:
3 20
18 15 10
75 72 45
输出样例:
94.50
解题思路
用一个结构体(当然也能用vector或者二维数组)来储存总量和总价,然后算出单价,按单价进行排序,这个题有点坑,题目中明说是正整数,但数据中估计有浮点数存在,所以总量和总价最好都用double来存,然后从单价最大的来选就可以了,就是个简单的贪心算法。代码
#include <cstdio> #include <algorithm> using namespace std; struct YB{ double a,b; //a为存量,b为总价,c为单价 double c; }x[1001]; int cmp(struct YB A,struct YB B){ return A.c>B.c; } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { scanf("%lf", &x[i].a); } for (int i = 0; i < n; i++) { scanf("%lf",&x[i].b); x[i].c=x[i].b/x[i].a; } sort(x,x+n,cmp); int i=0; double sum=0; while(m>0&&i<n){ if(m>x[i].a){ m-=x[i].a; sum+=x[i].b*1.0; }else{ sum+=x[i].c*m*1.0; m-=x[i].a; } i++; } printf("%.2f",sum); return 0; }
相关文章推荐
- libdvbpsi源码分析(四)PAT表解析/重建
- 淘宝搜索月饼惊现变形金刚
- PAT配置
- 什么是端口复用动态地址转换(PAT) 介绍配置实例
- MikroTik layer7-protocol
- PAT是如何工作的
- The Nokia Lumia 1020 is now available at AT&T
- PAT 乙级题:1002. 写出这个数 (20)
- PAT (Advanced Level) Practise 1001-1010
- 数据结构学习与实验指导(一)
- PAT Basic Level 1001-1010解题报告
- 1001. 害死人不偿命的(3n+1)猜想
- 1002. 写出这个数
- 1032. 挖掘机技术哪家强
- 1001. 害死人不偿命的(3n+1)猜想 (PAT basic)
- 1002. 写出这个数(PAT Basic)
- 1004. 成绩排名(PAT Basic)
- 1006. 换个格式输出整数(PAT Basic)
- 1007. 素数对猜想(PAT Basic)
- 1008. 数组元素循环右移问题