首页 > 代码库 > HDU 1009贪心
HDU 1009贪心
代码如下。需要说明的是,之前一直WA,发现对这题来说,难点不是贪心,是对浮点数的处理,做题经验不足会导致一直不能AC。在代码第43行,用1.0*m*x[i].a/x[i].b就能AC,但是如果直接用x[i].re*m则会WA。其实计算re只是为了排序,在最后计算结果的时候如果还用这个浮点数就会导致多个浮点误差累积,使误差会更大。而直接用m*x[i].a/x[i].b这样做,由于先算的是整数之间的乘法,然后再算一次除法,那么得到浮点数的误差就只有一次,而不是上一种情况的多次误差累积。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct{ 5 int a,b; 6 float re; 7 }node; 8 9 int cmp(const void* a,const void * b)10 {11 return (*(node *)a).re < (*(node *)b).re?1:-1;12 }13 14 node x[1005];15 16 int main()17 {18 int m,n,i;19 float max;20 while(scanf("%d%d",&m,&n))21 {22 if(m==-1 || n==-1)break;23 max = 0;24 for(i=0; i<n; i++)25 {26 scanf("%d%d",&x[i].a,&x[i].b);27 if(x[i].b==0)28 x[i].re = 10000;29 else x[i].re = (x[i].a*1.0)/x[i].b;30 31 }32 qsort(x,n,sizeof(node),cmp);33 for(i=0; i<n; i++)34 {35 /*printf("%d:%f\n",i,x[i].re);*/36 if(x[i].b < m)37 {38 max += x[i].a;39 m -= x[i].b;40 }41 else if(x[i].b > m)42 {43 max += 1.0*m*x[i].a/x[i].b; /*change to m*x[i].re can‘t AC*/44 break;45 }46 else47 {48 max += x[i].a;49 break;50 }51 }52 printf("%.3f\n",max);53 }54 return 0;55 }
HDU 1009贪心
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。