POJ 1064 Cable master

二分+验证。

这个题目精度卡的很紧。做的时候最好每个数先×100再做。

最精确的方法是字符串读入,然后转成long long。

输出的时候再把long long转回小数。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=10000+10;
int n;
long long k;
long long a[maxn];
char s[10];

bool check(long long len)
{
    long long cnt=0;
    for(int i=1;i<=n;i++)
    {
        cnt=cnt+a[i]/len;
        if(cnt>=k) return 1;
    }
    return 0;
}

int main()
{
    while(~scanf("%d%lld",&n,&k))
    {
        long long l=1,r=0,ans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            a[i]=0;
            for(int j=0;s[j];j++)
            {
                if(s[j]=='.') continue;
                a[i]=a[i]*10+(long long)(s[j]-'0');
            }
            r=max(r,a[i]);
        }

        while(l<=r)
        {
            long long mid=(l+r)/2;
            if(check(mid)) ans=mid,l=mid+1;
            else r=mid-1;
        }

        printf("%lld.%02lld\n",ans/100,ans%100);
    }
    return 0;
}

 

posted @ 2016-04-13 14:35  Fighting_Heart  阅读(154)  评论(0编辑  收藏  举报