网线切割

第二题。

原题链接:https://www.luogu.org/problem/show?pid=1297#sub

果然牵扯到浮点数题目就开始变得比较恶心人了啊。。

思路是有一步转化,先把米转换成厘米,转化成整数进行二分然后再转回来,这样好做一些。

和切木头那个题很像,也是要记录一个cnt,判断这个值和k的关系。

有一些细节部分需要好好处理。

参考代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #define maxn 10005
 5 #define maxl 1000000005
 6 using namespace std;
 7 int k,n,cnt;
 8 int a[maxn];
 9 double b,ans;
10 inline int read(){
11     int num = 0;
12     char c;
13     bool flag = false;
14     while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
15     if (c == '-')
16         flag = true;
17     else
18         num = c - '0';
19     while (isdigit(c = getchar()))
20         num = num * 10 + c - '0';
21     return (flag ? -1 : 1) * num;
22 }
23 bool check(int x){
24     cnt=0;
25     for (int i=1;i<=n;i++)
26       cnt+=a[i]/x;
27     if (cnt>=k) 
28         return true;
29     else 
30         return false;
31 }
32 int main(){
33     n = read();k = read();
34     for (int i=1;i<=n;i++){
35       scanf("%lf",&b);
36       a[i] = b * 100;
37     }
38     int l = 0;
39     int r = maxl;
40     int mid;
41     while (l <= r){
42         mid=(l + r + 1) / 2;
43         if (l == r) 
44           break;
45         if (check(mid))
46             l = mid;
47         else 
48             r = mid - 1;
49     }
50     ans = mid * 1.00 / 100;
51     printf("%.2lf",ans);
52     return 0;
53 }

 

posted @ 2017-10-21 21:36  ShawnZhou_Aether  阅读(189)  评论(0编辑  收藏  举报