搜索1007

题目大意:

输入N,K,N代表绳子的个数,K代表要求能够分割成长度相同的K段,求最长能够分割的长度

解题思路:

求出N条绳子中最长一条,先尝试一半的长度,如果分割个数小于K,或者大于K,改变长度,继续分割

代码:

#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
double a[10001];
int  dp(double m,int N,int K)
{
    int sum=0;
    for(int i=0;i<N;i++)
    sum+=(int)(a[i]/m);
    if(sum<K)
    return 0;
    return 1;
}
int main()
{
    int N,K;
    double low,high,mid;
    while(cin>>N>>K)
    {
        if(N==0&&K==0)
        return 0;
        for(int i=0;i<N;i++)
        cin>>a[i];
        sort(a,a+N);
        low=0;high=a[N-1];
        while(high-low>0.0001)
        {
            mid=(low+high)/2;
            if(dp(mid,N,K))
            low=mid;
            else high=mid;
        }
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<mid<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Sikaozhe/p/5352334.html