【POJ】1064Cable master

Posted on 2018-05-12 20:55  som_nico  阅读(131)  评论(0编辑  收藏  举报

白皮书的二分

 

题意:有n条绳子,他们的长度分别为li,从他们中切个出k条长度相同的绳子的话,这k条绳子每条最长能有多长?保留小数点后两位

分析:二分

#include<cstdio>
#include<cstring>
#include<cmath>
#define maxn 10010
#define INF 100001
double a[maxn];
int n,k;

bool dix(double x)
{
    int num=0,i;
    for(i=0;i<n;++i)
        num+=(int)(a[i]/x);
    return num>=k;//满足条件是返回true,不满足返回false 
}

int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        int i;
        for(i=0;i<n;++i)
            scanf("%lf",&a[i]);
        double left=0,right=INF,mid;
        i=1000;
        while(i--)
        {
            mid=(left+right)/2;
            if(dix(mid))
                left=mid;
            else
                right=mid;
        }
        printf("%0.2f\n",floor(right*100)/100);//注意精度,可不明白%0.2lf输出为什么会错 
    }
    return 0;
}