PAT乙级(Basic Level)真题 1010.月饼
2016-11-27 21:34
381 查看
题目地址
点击打开题目
解题思路
每一种月饼都有自己的库存num、总价sumprice,用结构体数组来表示这一系列月饼比开多个数组可读性高。
涉及单价的排序,故在结构体中加入单价price,便于对比排序。
用vector来存放结构体数组p。
按单价从高到低的顺序取库存,直到填满市场需求量。
注:在循环取库存过程中,由于涉及到浮点运算,故使用p[j].num * p[j].price来表示p[j].sumprice会出错。
AC代码如下:
点击打开题目
解题思路
每一种月饼都有自己的库存num、总价sumprice,用结构体数组来表示这一系列月饼比开多个数组可读性高。
涉及单价的排序,故在结构体中加入单价price,便于对比排序。
用vector来存放结构体数组p。
按单价从高到低的顺序取库存,直到填满市场需求量。
注:在循环取库存过程中,由于涉及到浮点运算,故使用p[j].num * p[j].price来表示p[j].sumprice会出错。
AC代码如下:
#include <iostream> #include <stdio.h> #include <vector> #include <algorithm> #include <iomanip> using namespace std; struct mooncake{ int num; int sumprice; double price; }; /* sort比较函数,单价高的排在前 */ bool cmp( mooncake a,mooncake b ){ return a.price>b.price; } int main() { int n,d; scanf("%d%d",&n,&d); vector<mooncake> p(n);//定义容器数组p(此处用指针会出错) for( int i=0;i<n;++i ){ scanf("%d",&p[i].num); } for( int i=0;i<n;++i ){ scanf("%d",&p[i].sumprice); p[i].price = double(p[i].sumprice) / double(p[i].num); } sort( p.begin(),p.end(),cmp ); double sum=0; for( int j=0;j<n;++j ){ if( p[j].num>=d ){//库存量够取出需要的库存,结束循环 sum += d * p[j].price; break; } else{//库存量不够时取出全部库存,然后到下一个库中取货 d -= p[j].num; sum += p[j].sumprice;/*!!!bug所在!!!*/ } } /* C++保留2位小数 */ cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum; return 0; }
相关文章推荐
- PAT乙级(Basic Level)真题-1010 月饼 (25)
- PAT乙级(Basic Level)真题 >月饼
- PAT乙级(Basic Level)真题 >D进制的A+B
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1003. 我要通过!
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1008. 数组元素循环右移问题
- PAT乙级(Basic Level)真题-1022 挖掘机技术哪家强(20)
- PAT乙级(Basic Level)真题 >福尔摩斯的约会 (Java记录)
- Java 实现PAT乙级(Basic Level)1001-1010 解题报告(一)
- 【PAT乙级(Basic Level)真题】1001:A+B和C
- PAT乙级(Basic Level)真题-1016. 部分A+B (15)
- PAT乙级(Basic Level)真题 >A除以B
- PAT乙级(Basic Level)真题 >插入与归并
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1001. 害死人不偿命的(3n+1)猜想
- PAT乙级(Basic Level)真题-1001 A+B和C (15)
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1011. A+B和C
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1013. 数素数
- PAT乙级(Basic Level)真题 >跟奥巴马一起编程
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1002. 写出这个数
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1005. 继续(3n+1)猜想
- PAT乙级(Basic Level)真题 >福尔摩斯的约会