PAT A1070 Mooncake(同B1020)
Sample Input:
3 200
180 150 100
7.5 7.2 4.5
Sample Output:
9.45
word | meaning |
---|---|
crusts | n.面包皮,wlke |
inventory | n.详细目录,存货清单 |
-
思路 1:
用一个结构体数组存储每种月饼,输入时计算出单价(总价/库存),再按单价排序,每次都选择单价最高的拿(如果够拿,即市场需求不少于库存),拿完更新需求,直到需求比库存小了(else),就只拿需求的量,在这一过程中将结果(总售价)累加到res变量中 -
坑点:
“随后一行给出 N 个正数表示每种月饼的库存量” ,题中只说了正数所以不同月饼的库存和价格可以是浮点型 -
code 1:
#include<bits/stdc++.h>
using namespace std;
struct MoonCake{
double piece;
double sell;
double store;
}mc[1010];
bool cmp(MoonCake a, MoonCake b){
return a.piece > b.piece;
}
int main(){
int n;
double m;
scanf("%d %lf", &n, &m);
for(int i = 0; i < n; ++i){
scanf("%lf", &mc[i].store);
}
for(int i = 0; i < n; ++i){
scanf("%lf", &mc[i].sell);
mc[i].piece = mc[i].sell / mc[i].store; //求单价
}
sort(mc, mc + n, cmp);
double result = 0.0;
for(int i = 0; i < n; ++i){
if(mc[i].store <= m){
//如果mc[i]的库存<=市场需求
m -= mc[i].store; //更新当前需求量
result += mc[i].sell;
}
else{
//如果库存比需求多了,只卖需求的量(并结束循环)
result += m * mc[i].piece;
break;
}
}
printf("%.2f\n", result);
return 0;
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct M{
double price, num, value; //Wrong1:正数 != 正整数
}mooncake[maxn];
bool cmp(M a, M b){
return a.price > b.price;
}
int main(){
int n;
double need;
scanf("%d %lf", &n, &need);
for(int i = 0; i < n; ++i){
scanf("%lf", &mooncake[i].num);
}
for(int i = 0; i < n; ++i){
scanf("%lf", &mooncake[i].value);
mooncake[i].price = mooncake[i].value / mooncake[i].num;
}
sort(mooncake, mooncake+n, cmp);
double sum = 0.0;
for(int i = 0; i < n && need > 0; ++i){
double num = need > mooncake[i].num ? mooncake[i].num : need;
sum += mooncake[i].price * num;
need -= num;
}
printf("%.2f", sum);
return 0;
}
- T3 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct Mooncake
{
double price, total_price, amount;
}mooncake[maxn];
bool cmp(Mooncake a, Mooncake b)
{
return a.price > b.price;
}
int main()
{
int n, d;
scanf("%d %d", &n, &d);
for(int i = 0; i < n; ++i)
{
scanf("%lf", &mooncake[i].amount); //WRONG 1: 用int型样例2错误
}
for(int i = 0; i < n; ++i)
{
scanf("%lf", &mooncake[i].total_price);
mooncake[i].price = mooncake[i].total_price / mooncake[i].amount;
}
sort(mooncake, mooncake+n, cmp);
int idex = 0;
double sum_price = 0;
while(d > 0 && idex < n) //WRONG 2:不加idex<n样例3会段错误
{
if(d > mooncake[idex].amount)
{
sum_price += mooncake[idex].total_price;
d -= mooncake[idex].amount;
}else
{
sum_price += mooncake[idex].price * d;
break;
}
idex++;
}
printf("%.2f", sum_price);
return 0;
}