P1577 切绳子 精度+二分
题意:给出n条绳子,可以剪绳子使其长度变化,要k条长度相同的绳子
问,这k条绳子最长能够多长?
思路:我们可以二分来做这道题,以绳子长度作为二分对象
满足情况向右区间二分,不满足则左区间
判断满不满足的方法:在该长度的情况下最多的绳子与k条绳子比较
这样题目基本就解决了
但是! 会出现问题,在小数方面是四舍五入的计算方法,
而绳子在长度方面是能舍去不能增加
为什么呢?倘若你得出1.36的长度,但是因为小数问题达到1.4
那么很明显是不对的,因为我们没有那么长的绳子能够到达1.4!
所以,我们把所有的数都*100,最后在重新/100就能避开小数在精度方面的问题了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }