当前位置: 代码迷 >> 综合 >> 1020 月饼 (25 分)(贪心)
  详细解决方案

1020 月饼 (25 分)(贪心)

热度:9   发布时间:2024-01-04 06:15:20.0

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入格式:

每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。

输出格式:

对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。

输入样例:

3 20
18 15 10
75 72 45

输出样例:

94.50

思路

简单的贪心算法,要想获得最大收益就要把单价最高的先卖出去,本题的难点就是在对单价的排序的时候,要带着总价格和库存量,需要自己手写排序算法对三者都排序,我这里选用的是快速排序算法。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
float price[1005] , stock[1005];
float unit[1005];
void qsort(int l , int r)//快速排序算法
{
    int i , j ;float mid , p ;i = l ; j = r;mid = unit[(l + r) / 2];do{
    while(unit[i] < mid ) i++;while(unit[j] > mid ) j--;if(i <= j)//三者同时交换{
    p = unit[i] ; unit[i] = unit[j] ; unit[j] = p;p = price[i] ; price[i] = price[j] ; price[j] = p;p = stock[i] ; stock[i] = stock[j] ; stock[j] = p;i++;j--;}}while(i<=j);if(l < j) qsort(l,j);if(i < r) qsort(i,r);
}
int main(){
    int n , m;cin>>n>>m;float sum = 0;for(int i = 1 ; i <= n ; i++)cin>>stock[i];for(int i = 1 ; i <= n ; i++){
    cin>>price[i];unit[i] = price[i] / stock[i];}qsort(1 , n);for(int i = n ; i >= 1 ; i--){
    if( m >= stock[i]){
    sum += price[i];m -= stock[i];}else{
    sum += unit[i] * m;break;}}printf("%.2f" , sum);
}