您的位置:首页 > 其它

pid=1009 FatMouse' Trade - 简单贪心

2013-04-08 09:16 344 查看
题意:用后面的换前面的,尽可能换取更多,物品可以拆分。
/* 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

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: