• 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);
    }
    
  • 相关阅读:
    ASP.NET Core 微信支付(一)【统一下单 APIV3】
    ASP.NET Core 跨域
    快速排序
    希尔排序(插入式与位移式优化)
    选择排序和插入排序
    冒泡排序
    八皇后问题
    递归与迷宫回溯问题
    逆波兰计算器
    栈实现综合计算器
  • 原文地址:https://www.cnblogs.com/houzm/p/12245442.html
Copyright © 2020-2023  润新知