题目大意:
输入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; }