PAT Basic 1020 ?饼 (25) [贪?算法]

Posted houzm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT Basic 1020 ?饼 (25) [贪?算法]相关的知识,希望对你有一定的参考价值。

题目

?饼是中国?在中秋佳节时吃的?种传统?品,不同地区有许多不同?味的?饼。现给定所有种类?饼的库存量、总售价、以及市场的最?需求量,请你计算可以获得的最?收益是多少。
注意:销售时允许取出?部分库存。样例给出的情形是这样的:假如我们有3种?饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最?需求量只有20万吨,那么我们最?收益策略应该是卖出全部15万吨第2种?饼、以及5万吨第3种?饼,获得 72 + 45/2 = 94.5(亿元)。
输?格式:
每个输?包含1个测试?例。每个测试?例先给出?个不超过1000的正整数N表示?饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最?需求量。随后??给出N个正数表示每种?饼的库存量(以万吨为单位);最后??给出N个正数表示每种?饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试?例,在??中输出最?收益,以亿元为单位并精确到?数点后2位。
输?样例:
3 20
18 15 10
75 72 45
输出样例:
94.50

题目分析

已知不同种类月饼的库存,总价格,市场需求量,求最大利润

解题思路

  1. 贪心思想:依次获取单位价格最贵的月饼
  2. 结构体moon,存储月饼的库存,总价格,单位价格(输入总价格时预处理,减少一次遍历)
  3. 按照单位价格降序排序,依次获取,直到达到市场需求量

Code

Code 01

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct moon {
    double w; // total weight (in thousand tons)
    double p; // total price (in billion yuan)
    double pp; // price per thousand ton
};
bool cmp(moon &m1,moon &m2) {
    return m1.pp>m2.pp;
}
int main(int argc, char * argv[]) {
    // 1 接收数据 
    int N,D;
    scanf("%d %d",&N,&D);
    vector<moon> vms(N); //存放月饼数据 
    for(int i=0; i<N; i++) scanf("%lf", &vms[i].w);
    for(int i=0; i<N; i++) {
        scanf("%lf", &vms[i].p);
        vms[i].pp = vms[i].p/vms[i].w; //计算每重量单位的价格 
    }
    // 2 按照单位价格高-低排序 
    sort(vms.begin(),vms.end(),cmp);
    // 3 求最大利润 
    double tp = 0.0;
    for(int i=0; i<N&&D>0; i++) {
        if(vms[i].w<D) {//如果当前月饼种类的重量小于需求剩余数,全部销售 
            D=D-vms[i].w;
            tp+=vms[i].p;
        } else { //如果当前月饼种类的重量大于需求剩余数,按照单位价计算剩余需求重量 
            tp+=D*vms[i].pp;
            D=0;
        }
    }
    printf("%.2f", tp);
}


以上是关于PAT Basic 1020 ?饼 (25) [贪?算法]的主要内容,如果未能解决你的问题,请参考以下文章

PAT Advanced 1037 Magic Coupon (25) [贪?算法]

PAT Advanced 1067 Sort with Swap(0,*) (25) [贪?算法]

PAT Advanced 1033 To Fill or Not to Fill (25) [贪?算法]

PAT1020 Tree Traversals (25)(25 分)

PAT Advanced 1020 Tree Traversals (25分)

PAT 1020 Tree Traversals (25)