杭电acm1009

http://acm.hdu.edu.cn/showproblem.php?pid=1009

贪心算法,以最大方式换得最大猫粮,先求猫粮的“性价比”,然后排序,再按性价比去依次将老鼠换完,得到结果

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 struct fat{
 4            double t,j,f;
 5           };//使用数组,容易书写 
 6 int main()
 7 {
 8  int m,n,i,k;
 9  double sum;
10  struct fat cat[1001],temp;
11  while(scanf("%d%d",&m,&n)!=EOF)
12     {
13      if(m==-1&&n==-1) break;
14      sum=0;
15      for(i=0;i<n;i++)
16         {
17          scanf("%lf%lf",&cat[i].j,&cat[i].f);
18          cat[i].t=cat[i].j/cat[i].f;  //求每个JavaBean的比重 
19         }
20       for(k=1;k<n;k++)
21          {for(i=0;i<n-k;i++)
22           {  
23            if(cat[i].t<cat[i+1].t)
24               {  
25                temp=cat[i+1];
26                cat[i+1]=cat[i];
27                cat[i]=temp; //将它们进行降序排序 
28               }    
29           }} 
30       for(i=0;i<n;i++)//这里的i<n是因为有可能猫粮够买下所有的食物 
31          {
32           if(m>=cat[i].f)
33             {
34              sum+=cat[i].j;
35               m-=(int)cat[i].f;//如果猫有的猫粮比所需食物多,则换下比重最大的那个
36             }
37           else if(m<cat[i].f)
38             {
39              sum+=(cat[i].t*m); 
40              m=0;
41              break;//如果猫粮不足,则按比例换取,并退出 
42             }
43          }
44       printf("%.3lf\n",sum);
45     }
46     return 0;
47 }

 

posted @ 2013-03-27 13:02  执着追求的IT小小鸟  阅读(300)  评论(0编辑  收藏  举报