zoukankan      html  css  js  c++  java
  • 【贪心】【HDOJ-1009】FatMouse' Trade

    Problem Description
    FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
    The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.
     
    Input
    The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers J[i] and F[i] respectively. The last test case is followed by two -1's. All integers are not greater than 1000.
     
    Output
    For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.
     
    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
     
    /************************************************************************************************************
    题意:老鼠用M猫粮换仓库里的鼠粮,仓库有n个房间,每个房间有j[i]鼠粮,需要f[i]猫粮换,
    可以换部分猫粮
    思路:简单的贪心问题,先算出性价比j[i]/f[i],然后从大到小排序,先从性价比高的开始换
    等到鼠粮或猫粮没有时结束
    注意:此题有几个比较坑的数据  
    
    0 1
    1 0
    1.000
    
    1 0
    0.000
    
    5 4
    10000 5
    2000 2
    100 0
    300 0
    10400.000
    ************************************************************************************************************/
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef struct 
    {
        int j;
        int f;
        double va;
    }node;
    node a[1000+10];
    bool cmp(node a, node b);
    int main()
    {
        int n , m;
        while(scanf("%d %d", &m , &n) && (m != -1 || n != -1))
        {
            double ans = 0;
            if(!n)
            {
                printf("%.3f
    ",ans);
                continue;
            }
            for(int i = 0 ; i < n ; i++)
            {
                scanf("%d %d", &a[i].j, &a[i].f);
                if(!a[i].f)
                {
                    ans += a[i].j;
                    a[i].j = 0;
                    continue;
                }
                a[i].va = a[i].j * 1.0 / a[i].f;
            }
            sort(a , a + n , cmp);
            for(int i = 0 ; m > 0 && i < n ; i++)
            {
                if(m >= a[i].f)
                {
                    m -= a[i].f;
                    ans += a[i].j;
                }
                else
                {
                    ans += a[i].va * m;
                    break;
                }
            }
            printf("%.3f
    ", ans);
        }
        return 0;
    }
    
    bool cmp(node a, node b)
    {
        if(a.va > b.va)
            return true;
        return false;
    }
     
  • 相关阅读:
    边工作边刷题:70天一遍leetcode: day 35
    边工作边刷题:70天一遍leetcode: day 36
    边工作边刷题:70天一遍leetcode: day 37-2
    边工作边刷题:70天一遍leetcode: day 37
    边工作边刷题:70天一遍leetcode: day 37-1
    边工作边刷题:70天一遍leetcode: day 38-2
    边工作边刷题:70天一遍leetcode: day 38-1
    边工作边刷题:70天一遍leetcode: day 38
    边工作边刷题:70天一遍leetcode: day 38-2
    边工作边刷题:70天一遍leetcode: day 38-1
  • 原文地址:https://www.cnblogs.com/ahu-shu/p/3551733.html
Copyright © 2011-2022 走看看