您的位置:首页 > 其它

HDU 1009 FatMouse' Trade

2014-10-26 20:36 441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009

题目大意:

老鼠有M磅猫食。有N个房间,每个房间前有一只猫,房间里有老鼠最喜欢的食品JavaBean,J[i]。若要引开猫,必须付出相应的猫食F[i]。当然这只老鼠没必要每次都付出所有的F[i]。若它付出F[i]的a%,则得到J[i]的a%。求老鼠能吃到的做多的JavaBean。

解题思路:

老鼠要获得最多的食品,就要用最小的猫食换取最多的猫食,这就要求J[i]/F[i]的比例要大。J[i]/F[i]的比例越大,证明在这个房间,小鼠付出得到的收获最有价值。于是我们将设置结构体,结构体里设置percent放置J[i]/F[i]。然后对结构体数组进行排序。依次按比例排序的付出猫食,即可。

例子:

输入

5 3

7 2

4 3

5 2

按J[i]/F[i]排序后:

7 2

5 2

4 3

在第一排数据上,小鼠付出2个猫食换得7个JavaBean。

在第二排数据上,小鼠付出2个猫食换得5个JavaBean。

在第三排数据上,小鼠只剩下1个猫食,便用这一个猫食换取1/3*4个JavaBean。

所以,总共换得13.333个JavaBan

代码:

#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct node
{
int l,num;
double r;
}c[3001];
bool compare(node a,node b)
{
return a.r>b.r;
}

int main()
{
int m,n;

while(scanf("%d %d",&m,&n) &&(m!=-1 || n!=-1))
{

for(int i=0;i<n;i++)
{
scanf("%d %d",&c[i].num,&c[i].l);
c[i].r=(double)c[i].num/c[i].l;//一定要强制转换
}
sort(c,c+n,compare);
double count=0;
int i=0;
while(m>c[i].l && i<n)
{
m=m-c[i].l;
count=count+c[i].num;
i++;

}
if(i!=n)
count=count+c[i].r*m;
else
count=count;

printf("%.3lf\n",count);
}
return 0;
}


</pre>因为没有这一步,把我卡了好久!<pre name="code" class="cpp">if(i!=n)
count=count+c[i].r*m;
else
count=count;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: