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 }