PTA跳转:原题链接
题目大意:给出月饼种类数量和市场需求量,然后给出每种月饼的数量和卖完这批月饼的总价。求最大利润。
解题思路:因为没有月饼单价,需要先计算,再以单价递减排序。如果没有达到市场需求量,直接把目前单价最高的月饼卖完,否则卖出部分即可。
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
struct Cake
{
double amount; //数量
double price; //这个种类月饼的总价
double unit_price; //单价(总价/数量)
}cake[1000];
bool cmp(Cake a, Cake b) //按单价递减排序
{
return a.unit_price > b.unit_price;
}
int main()
{
int N; //N为月饼种类数,D为市场需求数
double D;
cin >> N >> D;
for(int i = 0; i < N; i++)
{
cin >> cake[i].amount;
}
for(int i = 0; i < N; i++)
{
cin >> cake[i].price;
}
for(int i = 0; i < N; i++)
{
cake[i].unit_price = cake[i].price / cake[i].amount;
}
sort(cake, cake + N, cmp); //按单价递减排序
double cur_amount = 0; //当前数量初始化为0
double cur_price = 0; //当前价格初始化为0
for(int i = 0; i < N; i++)
{
if(cur_amount + cake[i].amount <= D) //买完当前种类的月饼仍未达到或刚好达到市场需求,全买
{
cur_amount += cake[i].amount;
cur_price += cake[i].price;
if(cur_amount == D) //买完刚好达到市场需求
break;
}
else //如果全买,会超过市场需求,则需要部分买,输出总利润
{
cur_price += cake[i].price * ((D - cur_amount) / cake[i].amount);
//括号部分表示买这类月饼的百分比,例如D为200,cur_amount为150,cake[i].amount为100
//我只需要再买50份,即cake[i].amount的50%,此时括号内的值为0.5
//因为准备跳出循环输出,不必再修改当前数量
break;
}
}
cout << fixed << setprecision(2) << cur_price;
return 0;
}
氷鸢鸢鸢
2020.7.13