贪心:月饼

题目内容:

现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,
其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。

输入描述:

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

输出描述:

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

输入样例:

3 20 18 15 10 75 72 45

输出样例:

94.50

分析

ni:对第i种月饼需求的月饼数量 ; wi:月第i种饼单价 (W[i] / M[i]) :
总收益: W = n1*w1 + n2*w2 + n3*w3+ …;
市场需求:D = n1 + n2 + …; (假如以n1、n2、n3…的顺序需求)

要使得W最大,肯定是首先取单价最大的尽可能多,所以:
首先计算每种月饼单价,并进行排序
然后满足市场需求条件取月饼

AC的渣渣代码:

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int Max = 1010;
struct Node{
    double stock;  //月饼库存 
    double tsp;    //月饼总售价 total sale price 
    double price;  //月饼单价 
};

Node mooncake[Max]; 
int N, D;

bool cmp(Node a, Node b){
    return a.price > b.price;
}
int main(){

    int i;
    double W = 0.0; //收益 
    cin >> N >> D;
    for(i = 0; i < N; i ++)
        cin>>mooncake[i].stock;
    for(i = 0;i < N; i ++){
        cin>>mooncake[i].tsp;
        mooncake[i].price = mooncake[i].tsp / mooncake[i].stock;
    }

    sort(mooncake, mooncake+N, cmp);
/*
//用while的写法稍微复杂,i有自增、有范围还是用for简单方便QAQ 
    i = 0;
    while(D && i < N){   //此处注意控制i的范围! 
        //如果该种月饼总库存比市场需求D小,则可全要 
        if(mooncake[i].stock <= D){                 
            W += mooncake[i].tsp;                       
            D -= mooncake[i].stock;                           
            i ++;                                        
        }
        //如果该月饼总库存比市场需求D大,则只要剩下的市场需求D的量 
        else if(mooncake[i].stock > D && D > 0){                                   
            W += mooncake[i].price * D * 1.0;            
            D -= D; 
            i ++;                                        
        }
    }
*/
    for(i = 0; i < N; i ++){    
        if ( D >= mooncake[i].stock ) {
            W += mooncake[i].tsp;
            D -= mooncake[i].stock;
        } 
        else if ( D < mooncake[i].stock && D > 0 ) {
            W += D * 1.0 * mooncake[i].price;
            D -= mooncake[i].stock;
        } 
        else 
            break;
    }
    //控制结果保留2位小数 
    cout<<fixed<<setprecision(2)<<W;                 
    return 0;
}
发布了15 篇原创文章 · 获赞 6 · 访问量 1074

猜你喜欢

转载自blog.csdn.net/qq_40306266/article/details/82026335
今日推荐