HDOJ1009.FatMouse' Trade

来源:互联网 发布:如何求矩阵的n次方 编辑:程序博客网 时间:2024/05/21 10:16

试题请参见: http://acm.hdu.edu.cn/showproblem.php?pid=1009

题目概述

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.

说实话, 这题意我也是看了翻译才看懂的.
大意是说, 有N个仓库存放有猫爱吃的CatFood和老鼠爱吃的JavaBean. 老鼠有M个CatFood可以”贿赂”猫换取这个仓库的JavaBean. 若老鼠使用这个仓库中a%的CatFood, 那么可以换取a%的JavaBean. 求老鼠最多可以获得多少个JavaBean.

解题思路

很显然, 如果JavaBean / CatFood的比率越高, 这个仓库的产出就越高. 意味着老鼠可以用最少的CatFood换取最多的JavaBean.

因此, 这很显然是贪心算法. 对JavaBean / CatFood的比值进行排序, 优先选择产值高的仓库. 当最后CatFood不够时, 再将仓库中a%的CatFood换成JavaBean.

遇到的问题

没有考虑到这种输入:

0 11 0

预期的输出应该是 1.000

源代码

#include <iostream>#include <iomanip>#include <algorithm>#define INT_MAX 2147483647const int MAX_SIZE = 1000;struct WareHouse {    double javaBean;    double catFood;    float rate;};WareHouse wareHouses[MAX_SIZE];bool compareTo(const WareHouse &x, const WareHouse &y) {    return x.rate > y.rate;}int main() {    int m = 0, n = 0;    while ( std::cin >> m >> n ) {        if ( m == -1 && n == -1 ) {            break;        }        for ( int i = 0; i < n; ++ i ) {            std::cin >> wareHouses[i].javaBean >> wareHouses[i].catFood;            if ( wareHouses[i].catFood == 0 ) {                wareHouses[i].rate = 2147483647;            } else {                wareHouses[i].rate = wareHouses[i].javaBean / wareHouses[i].catFood;            }        }        std::sort(wareHouses, wareHouses + n, compareTo);        double restCatFood = m;        double totalJavaBean = 0;        for ( int i = 0; i < n; ++ i ) {            if ( restCatFood < 0 ) {                break;            } else if ( restCatFood < wareHouses[i].catFood ) {                double rate = restCatFood / wareHouses[i].catFood;                totalJavaBean += wareHouses[i].javaBean * rate;            } else {                totalJavaBean += wareHouses[i].javaBean;            }            restCatFood -= wareHouses[i].catFood;        }        std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(3) << totalJavaBean << std::endl;    }    return 0;}
0 0