题目链接:hdu1009
题目解释:有m猫粮,有n个仓库;
每个仓库中,想要得到get[i]的食物,需要pay[i]的猫粮换取!
样例输入:
5 3
7 2
4 3
5 2
解释:总共有5猫粮 仓库3个房间。每个房间想要的食物和需换的猫粮在后三行。
输出:能换取最多的食物数量。
解题思路:
将每个房间能换取的利率算出,排序,每次取最大利率换取!(当猫粮量大于需要支付的猫粮量时,直接得到获取的食物求和,但是当小于时,需用利率算取,最后退出循环!)
代码:
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
struct Cat
{
double pay;
double get;
double rate;
};
bool comp(Cat a,Cat b)
{
if(a.rate < b.rate) return true;
else
return false;
}
int main()
{
int m,n;
Cat cat[1000];
while(cin>>m>>n)
{
double sum=0.0;
if(m==-1&&n==-1) break;
for(int i=0;i<n;i++)
{
scanf("%lf %lf",&cat[i].get,&cat[i].pay);
cat[i].rate=cat[i].pay/cat[i].get;//计算兑换比
}
sort(cat,cat+n,comp);//将兑换比从到小排列
for(int j=0;j<n;j++)
{
if(m>cat[j].pay)
{
sum += cat[j].get;
m=m-cat[j].pay;
}
else
{
sum += m / cat[j].rate;
break;
}
}
printf("%.3f\n",sum);
}
return 0;
}