hdu 1009 贪心算法

贪心算法:Hdu1009

题目大意:

老鼠准备了m磅的猫粮准备和守鼠粮的猫交换

猫守着n个仓库,其中存放着不同数量的鼠粮,不同的仓库交换其中的鼠粮所需要的猫粮是不一样的,所以每个仓库有两个数据  1 鼠粮的重量  2  换取这些鼠粮所需要的猫粮。

例如  第一个仓库  18  4  就表明老鼠用4磅的猫粮可换取18磅的鼠粮。但是如果老鼠没有4磅的猫粮,那它能支付所需猫粮的几分之几就可以得到相应鼠粮的几分之几,例如现在老鼠只有2磅猫粮,那么他能换的到第一个仓库中的9磅鼠粮。

现在有n个这样不同的仓库,老鼠要你帮它计算用它所有的猫粮可以换到最大数量的鼠粮是多少?

分析思路:

先用两个数组存放仓库中鼠粮的重量,和所需的猫粮。a[i] b[i];

再用一个数组c[i]来存放每个仓库对应的单位猫粮可以换多少鼠粮。

再以c[i]为标准对 a[i] b[i]c[i]进行排序,得到一个递减序列

然后性价比最高的仓库就在最前面,依次递减。

逐个换取,直到所有的猫粮换完为止,所换得到的鼠粮即所能换到的最多的鼠粮。

代码:

#include<stdio.h>
#include<stdlib.h>
/*double a[100000000];    使用固定的数组会 run time error 
double b[100000000];
double c[100000000];*/
int main () 
{
	double *a,*b,*c;
	int i,j,n;
	double m,t,sum=0;
 while(~scanf("%lf%d",&m,&n)){
 	 if (m==-1&&n==-1) break;
 	 a=(double *)malloc(sizeof(double)*n);
     b=(double *)malloc(sizeof(double)*n);  //改成动态申请的数组才可以通过. 
   	 c=(double *)malloc(sizeof(double)*n);
		for(i=0;i<n;i++){
			scanf("%lf%lf",&a[i],&b[i]);
			c[i]=a[i]/b[i];
		}
		for(i=0;i<n-1;i++){
			for(j=0;j<n-1-i;j++){
				if(c[j]<c[j+1]){
					t=c[j];
					c[j]=c[j+1];
					c[j+1]=t;
					t=a[j];
					a[j]=a[j+1];
					a[j+1]=t;
					t=b[j];
					b[j]=b[j+1];
					b[j+1]=t;
				}
			}
		}
		for(i=0;i<n;i++){
			if(m>=b[i]){
				sum+=a[i];
				m-=b[i];
			}
			else{
				sum+=m*c[i];
				break;
			}
		}
		printf("%.3lf\n",sum);
		sum=0;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值