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 }

 

posted @ 2017-09-21 20:58  qrfkickit  阅读(148)  评论(0编辑  收藏  举报