http://acm.hdu.edu.cn/showproblem.php?pid=1009
题目大意
老鼠有M磅catfood,有N个房间。老鼠用catfood交换javabeans,交换的方式有两种,一种是用f[i]交换j[i],还有一种是等比交换。
要求换取最多的javabean,那么优先选取j[i]/f[i]比值大的,不能取完的部分等比交换。
开一个结构体,存储f,j,rate,把rate按降序排序一下即可。
#include<iostream>
#include<algorithm>
#define N 1004
using namespace std;
struct node{
int f,j;
double rate;
};
node w[N];
bool cmp(node a,node b)
{
return a.rate>b.rate;
}
int main()
{
double m,max;
int n;
while(cin>>m>>n && m!=-1 && n!=-1)
{
for(int i=0;i<n;i++)
{
cin>>w[i].j>>w[i].f;
w[i].rate=1.0*w[i].j/w[i].f;
}
sort(w,w+n,cmp);
max=0;
for(int i=0;i<n;i++)
{
if(m>=w[i].f)
{
max+=w[i].j;
m-=w[i].f;
}
else
{
max+=m*w[i].rate;
break;
}
}
printf("%.3lf\n",max);
}
return 0;
}