【题解】【AcWing】1556. 月饼

143 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1556. 月饼

原题传送:AcWing 1556. 月饼

月饼是中国的一种烘焙食品,是在中秋节期间食用的传统美食。

月饼的种类多种多样,不同的月饼可能会有不同的表皮和馅料。

现在,考虑到各种月饼的库存量和价格,以及市场对月饼的总需求量,请你计算出可以赚到的最大利润。

例如,共有 33 种月饼,存量分别为 180,150,100180,150,100 (单位:千吨),总价值分别为 7.5,7.2,4.57.5,7.2,4.5 (单位:十亿元),市场总需求量为 200200 ,那么最佳销售方案是出售第二种月饼 150150 ,第三种月饼 5050 ,这样可获最大利润: 7.2+4.5/2=9.457.2+4.5/2=9.45

输入格式

第一行包含两个整数 NNDD ,分别表示月饼种类以及月饼总需求量。

第二行包含 NN 个正数,表示每种月饼的存量。

第三行包含 NN 个正数,表示每种月饼的总价值。

输出格式

输出一个数,表示最大利润,保留两位小数。

数据范围

1N10001 \le N \le 1000 , 1D5001 \le D \le 500 , 每种月饼的存量不超过 200200 ,总价值不超过 20002000

输入样例:

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;
}