Link
http://acm.hdu.edu.cn/showpro...
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
ACed Code
#include <stdio.h>
int main() {
int a, b, k;
double n[1000][3], temp;
// a 总共钱数 b 房间数
while (scanf("%d%d", &a, &b) != EOF && (a != -1) || (b != -1)) {
int i = 0, j = 0;
double sum = 0;
for (i = 0; i < b; i++) {
// 0 豆子总数 1 费用总数 2 单位价格
scanf("%lf%lf", &n[i][0], &n[i][1]);
n[i][2] = n[i][0] / n[i][1];
}
// 选择排序法 以单位价格为索引 最小的放最前
for (i = 0; i < b - 1; i++) {
k = i;
for (j = i + 1; j < b; j++) {
if (n[k][2] < n[j][2])
k = j;
}
for (int l = 0; l < 3; l++) {
temp = n[k][l];
n[k][l] = n[i][l];
n[i][l] = temp;
}
}
// 开始买豆子
for (i = 0; i < b; i++) {
if (a >= n[i][1]) {
sum += n[i][0];
a = a - n[i][1];
} else {
sum += a * n[i][2];
break;
}
}
printf("%.3f\n", sum);
}
}
Reference
Jason Lee
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。