贪心算法之简单贪心1月饼问题

题目描述
给定所有种类月饼的库存量、总售价以及市场的最大需求量,计算可以获得的最大收益。假如:有三种月饼,库存分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场需求量为20万吨,最大收益应该为卖出全部15万吨第二种月饼以及5万吨第三种月饼,获利72+45/2=94.5亿元。
输入样例
3 20 //三种月饼,市场最大需求量20
18 15 10 //各自库存
75 72 45 //各自总售价
输出样例
94.50
思路
1.总是选择单价最高的月饼售出。
2.判断单价最高的月饼的库存是否大于市场需求;若大于市场需求,则最重获利为市场需求量*最高单价;若小于,则最重获利为单价最高种类月饼的总售价与(市场需求量-单价最高月饼的总库存)乘以单价第二高的月饼的单价,依次判断。

#include
#include
using namespace std;
	
struct mooncake{
     
	double store;  //库存
	double sell;   //总售价
	double price;   //单价 
}cake[1010];        //存放月饼种类的数组
	
bool cmp(mooncake a,mooncake b){
     
	return a.price > b.price ;
} 
	
int main(){
     
		
	int N;   //月饼类别 
	double D;//市场需求量 
		
	scanf("%d%lf",&N,&D);
		
	for(int i = 0;i<N;i++){
     
		scanf("%lf",&cake[i].store);
	}	
		
	for(int i=0;i<N;i++){
     
		scanf("%lf",&cake[i].sell );
		cake[i].price = cake[i].sell / cake[i].store ;
		}
		
	sort(cake,cake+N,cmp);      //按单价从高到低排序 
		
	double ans = 0;  //收益
		
	for(int i=0;i<N;i++){
     
		if(cake[i].store <= D){
     
			ans = ans + cake[i].sell ;
			D = D - cake[i].store ;
		}else{
     
			ans = ans + cake[i].price * D;
			break;
		}
	} 
		
	printf("%.2f\n",ans);
	return 0;
}

按单价进行排序,积累这种解题的思路,以后遇到类似的题目,采用这种思路。

你可能感兴趣的:(算法,贪心算法)