HDOJ 1009 FatMouse' Trade

题意: 老鼠有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++ 罗维

 

View Code
 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 }

 

 

 

 

 

你可能感兴趣的:(tr)