poj 1064 Cable master
https://vjudge.net/problem/POJ-1064
题意:
有n条绳子,他们的长度分别为Li。如果从他们中切割出k条长度相同的绳子,那么这k条绳子每条最长有多长。如果不足1cm(m是输入单位),输出0.00。保留两位小数。
思路:
卡了两次,第一次读题忽略了小于一厘米的情况。第二个是r设置的太小,这种应该设置成一个无限大的数,我设置的1e8,就ac了,但是100就会wa。
输出小于1cm的情况的时候有坑,如果是0.006,那么直接输出会输出0.01,就是错误的,所以需要处理一下。即为floor(ans * 100) / 100,甚为巧妙。
代码:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <math.h> 4 using namespace std; 5 6 double a[10005]; 7 int n,k; 8 9 bool meet(double b) 10 { 11 int ans = 0; 12 13 for (int i = 0;i < n;i++) 14 { 15 int t = floor(a[i] / b); 16 17 ans += t; 18 } 19 20 //printf("%d\n",ans); 21 return ans >= k; 22 } 23 24 int main() 25 { 26 27 28 while (scanf("%d%d",&n,&k) == 2) 29 { 30 for (int i = 0;i < n;i++) 31 scanf("%lf",&a[i]); 32 33 sort(a,a+n); 34 35 double l = 0,r = 1e8; 36 37 for (int i = 0;i < 100;i++) 38 { 39 double mid = (l + r) / 2; 40 41 if (meet(mid)) l = mid; 42 else r = mid; 43 } 44 45 printf("%.2f\n",floor(l * 100) / 100); 46 47 //printf("%.2f\n",0.006); 48 } 49 50 51 return 0; 52 }
康复训练中~欢迎交流!