题意: 老鼠有m 磅猫粮, 有n 个房间,每个房间有j[i] 磅javaben, 求老鼠能够最多能换取多少javabean,交换规则是:用 f[i] *a% 换得j[i] * a% 磅javaben.如:j[i] = 7, f[i] = 2, 那么老鼠只要拿2 磅的猫粮就可以换7 磅的javaben, 那1 磅猫粮可以换3.5 磅 javaben,以此类推。
思路: 说是简单贪心,每个房间求一个scale = f[i] / j[i], 从最大的scale 换起,思路很明显, 就是一些细节没考虑的啊,WA了无数次,%>_<%。。。
WA: 1.是数据类型定义错了。
2.然后是没有考虑到当f[i] == 0 的时候要全部加进去。
6982661 | 2012-10-24 09:55:05 | Accepted | 1009 | 109MS | 296K | 946 B | C++ | 罗维 |
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 struct room 6 { 7 double javaBen; //注意数据类型 8 double catFood; 9 double scale; 10 }; 11 12 bool cmp(room a, room b) 13 { 14 return a.scale > b.scale; 15 } 16 17 int main() 18 { 19 room trade[1001]; 20 double obtain; 21 double m; 22 int i, n; 23 while (scanf("%lf %d", &m, &n)!=EOF &&(n!=-1 || m!=-1)) 24 { 25 obtain = 0; 26 for (i=0; i<n; i++) 27 { 28 cin>>trade[i].javaBen>>trade[i].catFood; 29 trade[i].scale = trade[i].catFood != 0 ? trade[i].javaBen/trade[i].catFood : trade[i].javaBen; 30 if (trade[i].catFood == 0) //加进去在下边要剔除 31 obtain += trade[i].javaBen; 32 } 33 34 sort(trade, trade+n, cmp); 35 for (i=0; i<n && m!=0; i++) 36 { 37 if (trade[i].catFood == 0) //剔除,上边已经交换过了。 38 continue; 39 if (m >= trade[i].catFood) 40 { 41 m -= trade[i].catFood; 42 obtain += trade[i].javaBen; 43 } 44 else 45 { 46 obtain += trade[i].scale * m; 47 m = 0; 48 } 49 } 50 printf("%.03lf\n", obtain); 51 52 } 53 return 0; 54 }