HDU - 1009的题目链接
(一)大意
这个题其实不难,但英语看的着实令人难受。博主大概来翻译一下,大概就是给你m磅的猫粮,有n个房子,每个房子呢,都有若干的javabeans。每个房子的猫粮与javabeans的兑换比率不同,(比如数据给你的是7 2,代表2磅猫粮可以换7磅javabeans。所以我们希望 j[i] /f[i]的比率越大越好)你要做的就是尽可能把手中的猫粮换成更多的javabeans。
(二)思路
思路很简单啊,考虑到每个房子的猫粮与javabeans的兑换比率不同。我们只要优先去兑换比率高的房子即可,即用少的猫粮去兑换多的javabeans。我们只需要计算每个房子中猫粮与javabeans的兑换率,再来个排序。这样就能实现,优先每次去的是兑换比率最高的房子,这样,我们手中的猫粮,就能换到最多的javabeans。
(三)代码
#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <string>
#include <iostream>
using namespace std;
const int maxn = 1000;
const int inf=0x3f3f3f3f;
struct Node
{
double j,f,price; //price是性价比,性价比高代表能用猫粮换更多的javabeans
};
bool cmp(Node a,Node b)
{
return a.price>b.price;
//把房子按性价比从高到底排列,这样我们优先进入兑换性价比高的房子
}
int main()
{
double sum,m;
// m是我们手中的猫粮数量,要设为double ,sum为我们得到的javabeans的数量
int n;
while(scanf("%lf%d",&m,&n)!=EOF)
{
sum=0;
if(m==-1&&n==-1) break;
Node fatmouse[maxn];
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&fatmouse[i].j,&fatmouse[i].f);
fatmouse[i].price=fatmouse[i].j/fatmouse[i].f; //计算每一个房子的兑换率
}
sort(fatmouse,fatmouse+n,cmp);
for(int i=0;i<n&&m;i++)
//已经遍及完所有的房子,或者手中猫粮已经兑换完则跳出循环。
{
if(m>=fatmouse[i].f) //如果手中的猫粮比这个房子所有猫粮要多
{
m-=fatmouse[i].f; //全部把房子里面的猫粮换成javabeans
sum+=fatmouse[i].j;
}
else
{
sum+= fatmouse[i].price*m;
//当手中猫粮不足时,就把手里的猫粮全部兑换成的javabeans
m=0;
}
}
printf("%.3f\n",sum);
}
return 0;
}