• ZOJ 2109 FatMouse' Trade (背包 dp + 贪婪)


    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109

    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


    翻译:

    从前有仅仅肥肥的老鼠。他叫FatMouse,他就像人类的恐怖分子跟敌人交易军火一样,猥琐的他准备了M磅猫食,准备与守卫仓库的大猫们进行交易,仓库里有他最爱吃的食物Javabean。


    仓库里有N个房间,第i间房间里有J[i]磅Javabean且须要F[i]磅猫食进行交换,FatMouse不必吧每一个房间里的Javabean所实用于交易,相反。他可以付给大猫F[i]*a%磅猫食,从而换的J[i]*a%磅的Javabean。当中,a是一个实数,如今他给你布置一个家庭作业,请你告诉他他最多可以获得多少磅Javabean。
    输入描写叙述:
    输入包括多组測试数据,每组測试数据的开头一行是两个非负整数M, N.接下来的N行中,每行包括两个非负整数J[i]和F[i],最后一组測试数据是两个-1。全部的整数的值不糊超过1000。
    输出描写叙述:
    对于每组測试数据,在一行上打印出一个3位小数的实数,这个实数是FatMouse可以交易到的最大数量的Javabean.


    解题思路:
    本题要求输出最大交易量。并保留三位小数。这样,我们使用J[i]除以F[i]就得到了a,那么,交易的时候,为了获得最多的Javabean,要先交易a大的。这样就确保了能交易到最多的Javabean.
    把数据读入结构体中,再将结构体作为向量的元素,再按a由大到小的顺序给向量排序,然后依次进行计算。这样的题目属于背包类的题目!

    (dp + 贪心)


    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <set>
    #define MAXN 10005
    #define RST(N)memset(N, 0, sizeof(N))
    #include <algorithm>
    using namespace std;
    
    typedef struct Mouse_ {
        double J, F;
        double a;
    }Mouse;
    
    int n, m;
    vector <Mouse> v;
    vector <Mouse> ::iterator it;
    
    bool cmp(const Mouse m1, const Mouse m2)
    {
        if(m1.a != m2.a) return m1.a > m2.a;
        else return m1.F < m2.F;
    }
    
    int main()
    {
        while(~scanf("%d %d", &n, &m)) {
            if(n == -1 && m == -1) break;
            Mouse mouse;
            v.clear();
            for(int i=0; i<m; i++) {
                scanf("%lf %lf", &mouse.J, &mouse.F);
                mouse.a = mouse.J/mouse.F;
                v.push_back(mouse);
            }
            sort(v.begin(), v.end(), cmp);
            double sum = 0;
            for(int i=0; i<v.size(); i++) {
                if(n > v[i].F) {
                    sum += v[i].J;
                    n -= v[i].F;
                }else {
                    sum += n*v[i].a;
                    break;
                }
            }
            printf("%.3lf
    ", sum);
        }
        return 0;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Linux下svn服务器搭建
    mybatis-generator自动生成代码插件使用详解
    java中Class.forName("xxx")和ClassLoader().loadClass("xxx")的区别
    ExecutorService中submit()和execute()的区别
    Redis学习总结(1)——数据持久化
    Java内存模型及性能优化
    (转)Lock和synchronized比较详解
    SpringBoot中获取spring.profiles.active
    SpringBoot添加拦截器
    SpringBoot与Kafka集成
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4665440.html
Copyright © 2020-2023  润新知