hdu1009 FatMouse' Trade

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009

题目大意:老鼠想要用n个猫粮在m个房间中换取自己想要的食物。在第i个房间中用f[i]个猫粮可换取j[i]个食物,要求用n个猫粮在这m个房间中换取最多的食物。

解题思路:每个房间都有一个兑换率j[i]/f[i],将所有的房间按兑换率从大到小排序,最后在从前往后兑换,直到n个猫粮用完。

代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct node
{
    double x,y;
}node;
node p[1002];
bool ab(node a,node b)
{
    node c;
    c.x=a.x/a.y;
    c.y=b.x/b.y;
    if(c.x>=c.y)
         return true;
    else
         return false;
}
int main()
{
    int n,m,i;
    double sum,s;
    while(scanf("%d%d",&n,&m)!=EOF&&(n!=-1||m!=-1))
    {
        for(i=0;i<m;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        sort(p,p+m,ab);//按兑换率从大到小排序,即按函数ab排序
        s=n;
        for(sum=0.0,i=0;i<m;i++)
        {
            if(s>=p[i].y)//如果现有猫粮大于等于该房间需要猫粮则可兑换相应的食物更新现有猫粮
            {
                sum+=p[i].x;
                s=s-p[i].y;
            }
            else //如果现有猫粮少于需要猫粮,则每颗只能兑换p[i].x/p[i].y,
                 //本次可兑换(p[i].x/p[i].y)*s个食物,猫粮在该次已经兑换完,结束
            {
                sum+=(p[i].x/p[i].y)*s;
                break;
            }
        }
        printf("%.3lf\n",sum);
    }
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值