本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1556. 月饼
原题传送:AcWing 1556. 月饼
月饼是中国的一种烘焙食品,是在中秋节期间食用的传统美食。
月饼的种类多种多样,不同的月饼可能会有不同的表皮和馅料。
现在,考虑到各种月饼的库存量和价格,以及市场对月饼的总需求量,请你计算出可以赚到的最大利润。
例如,共有 种月饼,存量分别为 (单位:千吨),总价值分别为 (单位:十亿元),市场总需求量为 ,那么最佳销售方案是出售第二种月饼 ,第三种月饼 ,这样可获最大利润: 。
输入格式
第一行包含两个整数 和 ,分别表示月饼种类以及月饼总需求量。
第二行包含 个正数,表示每种月饼的存量。
第三行包含 个正数,表示每种月饼的总价值。
输出格式
输出一个数,表示最大利润,保留两位小数。
数据范围
, , 每种月饼的存量不超过 ,总价值不超过 。
输入样例:
3 200
180 150 100
7.5 7.2 4.5
输出样例:
9.45
思路:
以单价为关键字排序月饼,然后尽量取单价最高的月饼。
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
struct cake
{
double sum, val, pri;
}mooncake[N];
bool cmp(cake a, cake b)
{
return a.pri > b.pri;
}
int main()
{
int n;
double d, sum = 0.0;
scanf("%d%lf", &n, &d);
for(int i = 0; i < n; i++)
{
scanf("%lf", &mooncake[i].sum);
}
for(int i = 0; i < n; i++)
{
scanf("%lf", &mooncake[i].val);
mooncake[i].pri = 1.0 * mooncake[i].val / mooncake[i].sum;
}
sort(mooncake, mooncake + n, cmp);
for(int i = 0; i < n; i++)
{
if(d >= mooncake[i].sum)
{
sum += mooncake[i].val;
d -= mooncake[i].sum;
}
else
{
sum += 1.0 * mooncake[i].pri * d;
break;
}
}
printf("%.2lf\n", sum);
return 0;
}