HDU 1009 FatMouse' Trade(贪心)

Description
一共有n个房子,每个房子里有老鼠喜欢吃的食物,但是每个房间里的食物的价格不一样。老鼠用m元,问m元最多可以卖多少食物,其中每个房间里的食物可以被分割
Input
多组输入,每组用例第一行为两个证书m和n表示老鼠初始钱数和房间数,之后n行每行两个整数get和pay表示老鼠在这个房间得到get单位的食物,就要付pay元,以0 0结束输入
Output
对于每组用例,输出老鼠用m元最多可以买到多少食物,小数点后保留三位
Sample Input
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
Sample Output
13.333
31.500
Solution
对每个房间的ave=get/pay值排序,每次贪心的拿ave最高的,对于当前能够买到的最高ave值的食物,能买完就买完,不能买完就把剩下的钱全部买这种食物
Code

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 10010
struct node
{
    double get,pay;
    double ave;//get和pay的比值 
}cat[maxn];
int cmp(node a,node b)
{
    return a.ave>b.ave;//将比值按降序排 
}
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n))
    {
        if(m==-1&&n==-1)//输入结束条件 
            break;
        double ans=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lf%lf",&cat[i].get,&cat[i].pay);
            cat[i].ave=cat[i].get/cat[i].pay;
        }
        sort(cat,cat+n,cmp);
        for(int i=0;i<n;i++)
            if(m>=cat[i].pay)//够换 
            {
                m-=cat[i].pay;
                ans+=cat[i].get;
            }
            else//不够换 
            {
                ans+=m*cat[i].ave;//按比例换 
                break;
            }
        printf("%.3lf\n",ans);
    }
    return 0;
}

你可能感兴趣的:(HDU 1009 FatMouse' Trade(贪心))