欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

贪心

程序员文章站 2022-06-13 12:31:40
...

局部最优

待补

接月饼

贪心

#include <cstdio>
#include <algorithm>

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){
			D-=cake[i].store;
			ans += cake[i].sell;
		}else{
			ans += cake[i].price*D;//当库存量高于需求量D时,直接计算收益就行 不用令需求量为0, 
			break;//记得将循环中断 
		}
		
		
	} 
	printf("%.2f\n",ans);//精确到小数点后两位 
	return 0; 
	
}

思路:求出单价后 按单价高低排序,如果库存小于需求,先卖单价最高的,再依次找次高的,每次把卖掉的需求减掉。

           如果库存大于需求 那直接按需求量卖掉就好了,直接求价钱就行

贪心


#include <cstdio>
int main(){
	int count[10];
	for(int i=0;i<10;i++){
		scanf("%d",&count[i]);
	}
	for(int i=1;i<10;i++){
		if(count[i]>0){
			printf("%d",i);
			count[i]--;//把输出的这个首位减掉一个 
			break;
		}
	}
	for(int i=0;i<10;i++){
		for(int j=0;j<count[i];j++){
			printf("%d",i);
		}
	}
	return 0;
}
思路:从1-9选其中不为零的数中最小的那个做首位。然后从0-9依次选最小的顺序输出,注意要嵌套循环输出。