http://poj.org/problem?id=1064
题意:就是有N条线段,要分成m段,求每段最大是多少
这个题挺有意思的。二分答案(答案的区间在0.01和max(len(n))之间)。
还有一个挺有意思的,就是我发现有个案例我过不了
4 2540
8.02
7.43
4.57
5.39
这个我过不了,然后我debug的时候发现,我存的数据和这个不一样,我用Int存的,是每个扩大100倍,但是我的第一个数据变成了801
我在debug看的时候我发现了一个问题,输入8.02的值,在debug那个窗口显示的确实8.019999999,我感到很奇怪,然后查了一下,也明白了
因为数据在计算机中的存储都是以二进制来存的,但是0.2在计算机中表示不出来,那么计算机就用一个最接近它的值来表示这个数字
所以在进行扩大的时候,可以采取四舍五入的方式,这样就可以保证你在扩大的时候不会出现我这种问题,当然这个题的数据问题,不进行四舍五入也是可以过的
1 #include <stdio.h> 2 #include <string.h> 3 4 5 int n,m; 6 int num[10005]; 7 double x; 8 9 int cnt(int x) 10 { 11 int tmp = 0; 12 for(int i = 1;i<=n;i++) 13 tmp+=num[i]/x; 14 return tmp; 15 } 16 17 18 int main() 19 { 20 while(~scanf("%d%d",&n,&m)) 21 { 22 int left = 1,Max = 0,ans = 0; 23 for(int i = 1;i<=n;i++) 24 { 25 scanf("%lf",&x); 26 num[i] = x*100; //这里也可以改成(x+0.05)*100,这样更加的准确 27 if(num[i]>Max) 28 Max = num[i]; 29 } 30 while(left<=Max) 31 { 32 int mid = (left+Max)/2; 33 if(cnt(mid)>=m) 34 { 35 left = mid+1; 36 ans = mid; 37 }else 38 { 39 Max = mid-1; 40 } 41 } 42 printf("%.2lf\n",ans*0.01); 43 } 44 return 0; 45 }
时间: 2024-10-11 18:13:18