P1577 切绳子 精度+二分

题意:给出n条绳子,可以剪绳子使其长度变化,要k条长度相同的绳子

   问,这k条绳子最长能够多长?

思路:我们可以二分来做这道题,以绳子长度作为二分对象

   满足情况向右区间二分,不满足则左区间

   判断满不满足的方法:在该长度的情况下最多的绳子与k条绳子比较

      这样题目基本就解决了

   但是! 会出现问题,在小数方面是四舍五入的计算方法,

   而绳子在长度方面是能舍去不能增加

   为什么呢?倘若你得出1.36的长度,但是因为小数问题达到1.4

   那么很明显是不对的,因为我们没有那么长的绳子能够到达1.4!

   所以,我们把所有的数都*100,最后在重新/100就能避开小数在精度方面的问题了

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e4+10;
 4 double d[maxn];
 5 int a[maxn];
 6 int n,limit;
 7 int check(int mid)
 8 {
 9     int sum=0;
10     for(int i=1;i<=n;i++){
11         int tmp=floor(a[i]/mid);
12         sum+=tmp;
13     }
14     if(sum>=limit) return 1;
15     else return 0;
16 }
17 int main()
18 {
19     scanf("%d%d",&n,&limit);
20     for(int i=1;i<=n;i++){
21         scanf("%lf",&d[i]);
22         a[i]=d[i]*100;
23     }
24     int L=0,R=1e9+10;
25     double ans;
26     while(L<=R){
27         int mid=(L+R)/2;
28         if(mid==0) break;
29         if(check(mid)){
30             L=mid+1;
31             ans=mid;
32         }
33         else{
34             R=mid-1;
35         }
36     }
37     printf("%.2f\n",ans/100);
38     return 0;
39 }
View Code

 

    

posted @ 2020-04-12 10:21  古比  阅读(202)  评论(0编辑  收藏  举报