洛谷 1577 切绳子

【题解】

  二分答案。

  给出的是两位小数,并没有什么影响,乘100转化成整数就很方便了。

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define LL long long
 4 #define rg register
 5 #define N 200010
 6 using namespace std;
 7 int n,k,l,r,mid,a[N];
 8 inline int read(){
 9     int k=0,f=1; char c=getchar();
10     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
11     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
12     return k*f;
13 }
14 inline bool check(){
15     int sum=0;
16     for(rg int i=1;i<=n;i++) sum+=a[i]/mid;
17     return sum>=k;
18 }
19 int main(){
20     n=read(); k=read();
21     for(rg int i=1;i<=n;i++){
22         double x; scanf("%lf",&x);
23         a[i]=(int)(x*100);
24         r=max(r,a[i]);
25     }
26     r++;
27     while(l+1<r){
28         mid=(l+r)>>1;
29         if(check()) l=mid;
30         else r=mid;
31     }
32     printf("%d.",l/100);
33     l%=100;
34     if(l<10) printf("0");
35     printf("%d",l);
36     return 0;
37 }
View Code
原文地址:https://www.cnblogs.com/DriverLao/p/9296100.html