试题请参见: 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 1
1 0
预期的输出应该是 1.000
源代码
#include <iostream>
#include <iomanip>
#include <algorithm>
#define INT_MAX 2147483647
const 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;
}