PAT 乙级 1020 月饼 v1.0
1. 题目简述及在线测试位置
1.1 已知各种月饼的库存量及其总价 和 市场需求量,求最大收益
1.2 在线测试位置:PAT 1020 月饼
2. 基本思路
2.1 最大收益意味着价位高的月饼优先卖出,将月饼按平均价格从高到低排序,依次取出,直到所有月饼取出 或 取出的月饼总量达到市场需求量
2.2 有两个测试点需要注意:市场需求量可能大于月饼库存总量、月饼的库存可能是小数
解题用的数据结构是结构体数组
#define MAX 1001
struct MoonCake
{
float Quantity; //月饼数量
float Price; //月饼总价
float Average; //月饼均价(月饼总价/月饼数量)
};
3. AC代码
#include <algorithm>
#include <iostream>
using namespace std;
#define MAX 1001
struct MoonCake
{
float Quantity; //月饼数量
float Price; //月饼总价
float Average; //月饼均价(月饼总价/月饼数量)
};
//按月饼的平均价格从大向小排序
bool Compare(struct MoonCake A, struct MoonCake B)
{
return A.Average > B.Average;
}
int main()
{
int Kind, SumQuantity; //月饼种类、市场需要总量
float quantity, price; //月饼单品数量、月饼单品总价
float CurrentSumQuantity=0,SumEarning=0;
scanf("%d %d", &Kind, &SumQuantity);
struct MoonCake MCake[MAX]; //初始化均价
for (int i = 0; i < MAX; i++)
MCake[i].Average = 0;
for (int i = 0; i < Kind; i++)
{
scanf("%f", &quantity);
MCake[i].Quantity = quantity;
}
for (int i = 0; i < Kind; i++)
{
scanf("%f", &price);
MCake[i].Price = price;
MCake[i].Average = MCake[i].Price / MCake[i].Quantity;
}
sort(MCake, MCake + Kind,Compare); //按月饼的平均价格从大向小排序,后面按此顺序取出月饼
for (int i = 0; i < Kind; i++) //循环正常结束:库存总量小于市场需求总量;执行break:库存>=市场
{
if (MCake[i].Quantity + CurrentSumQuantity >= SumQuantity)
{
SumEarning += float(SumQuantity - CurrentSumQuantity) * MCake[i].Average;
break;
}
else
{
CurrentSumQuantity += MCake[i].Quantity;
SumEarning += MCake[i].Price;
}
}
printf("%0.2f", SumEarning);
return 0;
}