pid=1009 FatMouse' Trade - 简单贪心

题意:用后面的换前面的,尽可能换取更多,物品可以拆分。
/*
	http://acm.hdu.edu.cn/showproblem.php?pid=1009 FatMouse' Trade
	简单贪心
*/
#pragma comment(linker, "/stack:64000000")
#define _CRT_SECURE_NO_DEPRECATE

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
using namespace std;

template <typename _T>
_T Max(_T a , _T b){
	return (a>b)?(a):(b);
}
template <typename _T>
_T Max(_T a , _T b, _T c){
	return (a>Max(b,c))?(a):(Max(b,c));
}
template <typename _T>
_T Min(_T a , _T b){
	return (a<b)?(a):(b);
}
template <typename _T>
_T Min(_T a , _T b, _T c){
	return (a<Min(b,c))?(a):(Min(b,c));
}

const int inf    = -(1<<30);
const int INF    =  (1<<30);
const int M      =  1e4 +10;


struct T{
	int cost,value;
}trade[M];

bool comp(T a,T b){
	return (a.value*1.0/a.cost) > (b.value*1.0/b.cost);
}

int main(){
	//freopen("in.txt","r",stdin);
	int n,m;
	while(cin >> m >> n && n>=0&&m>=0){
		if(n==0){cout << "0.000" << endl;continue;}
		for(int i = 0 ; i < n ; i++){
			cin >> trade[i].value >> trade[i].cost;
		}
		sort(trade,trade+n,comp);
		int sum = 0;
		double ans = 0;
		for(int i = 0 ;  ; i++){
			if(m<trade[i].cost || !(i<n) ){	
				if(i<n && m>0 && trade[i].cost>0)
					ans = sum + m*(trade[i].value*1.0/trade[i].cost);
				else if(i<n && m!=0 && trade[i].cost==0)
					ans = sum + m*(trade[i].value*1.0);
				else if(i<n && m==0 && trade[i].cost==0)
					ans = sum + (trade[i].value*1.0);
				break;
			}
			ans = sum += trade[i].value;
			m -= trade[i].cost;
		}
		printf("%.3lf\n",(double)ans);
	}
	return 0;
}

/*
0 1
1 0
1 0
5 4
10000 5
2000 2
100 0
300 0
-1 -1

=
1.000
0.000
10400.000

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值