http://acm.hdu.edu.cn/showpro...php
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.ui
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.this
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.code
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1排序
13.333
31.500索引
#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); } }
Jason Leeip