杭电1009

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1009

这道题主要用到的是贪心算法,百度百科对这个算法的解释如下http://baike.baidu.com/view/298415.htm

很庆幸这道题没有像百科对贪心算法使用解释的那样复杂,相似于背包问题,这道题仅仅用每次取单位质量价值最大物品的方法来解就可以了。

我的代码如下(用G++编译通过):

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10000
 
struct trade{
	int J;
	int F;
	double value;
} tradeObj[maxsize];

int cmp(const void *a,const void *b){
	struct trade *aa=(trade *)a;
	struct trade *bb=(trade *)b;
	return ((aa->value<bb->value)?1:-1);
}
int main(){
	int M,N,i;
	double totalMount;
	while(scanf("%d %d",&M,&N)!=EOF){
		totalMount=0.000;
		if(M==-1&&N==-1)
			break;
		for(i=0;i<N;i++){
			scanf("%d %d",&tradeObj[i].J,&tradeObj[i].F);
			tradeObj[i].value=((double)tradeObj[i].J)/((double)tradeObj[i].F);
		}
		if(N==0){
			printf("%.3f\n",totalMount);
			continue;
		}
		if(M==0){
			for(i=0;i<N;i++){
				if(tradeObj[i].F==0){
					totalMount+=(double)tradeObj[i].J;
				}
			}	
			printf("%.3f\n",totalMount);
			continue;
		}	
		qsort(tradeObj,N,sizeof(tradeObj[0]),cmp);
		//for(i=0;i<N;i++)
		//	printf("%d %d %f\n",tradeObj[i].J,tradeObj[i].F,tradeObj[i].value);
		i=0;
		while(M){
			if(M>=tradeObj[i].F){
				totalMount+=(double)tradeObj[i].J;
				//totalMount+=tradeObj[i].J;
				M-=tradeObj[i].F;
			}
			else{
				totalMount+=((double)M)/((double)tradeObj[i].F)*((double)tradeObj[i].J);
				//totalMount+=M/tradeObj[i].F*tradeObj[i].J;
				break;
			}			
			i++;	
		}
		printf("%.3f\n",totalMount);
	}
	return 0;
} 

题目给的例子其实不足以成为验证能否AC的条件,综合网友的意见,还必须至少满足下面几个例子

0 4
1 0
9 1
3 0
10 0
14.000

1 0
0.000

5 4
10000 5
2000 2
100 0
300 0
10400.000
另外数据类型用double,应该是考虑到会有大数出现吧。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值