1.先来理解一下题意,所谓的k段,并不是刚好切成k段,而是至少可以切成k段,然后看这些切出来的等长的绳子长度最多可以是多少
2.思路:二分,left=0,right=单段绳子的最大长度,每次用mid=(left+right)>>1,这个mid值去计算,总共可以切成多少段长度为mid的小绳子,记这个数量为cnt;如果cnt<k,说明mid太大,需要减小;如果cnt>=k,说明按mid来切割的话,可以切成至少k段长度为mid的小绳子,于是用ans记录这个mid值,然后增大mid,知道left>right,说明所有的mid值都遍历完了,最后输出ans即可。
代码如下:
#include <bits/stdc++.h>
#define maxn 10005
using namespace std;
double input[maxn];
int l[maxn];
int n,k;
int count(int x){
int cnt=0;
for(int i=0;i<n;i++){
cnt+=l[i]/x;
}
return cnt;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%lf",&input[i]);
l[i]=input[i]*100;
}
sort(l,l+n);
int left=0,right=l[n-1];
int ans=0;
while(left<=right){
int mid=(left+right)>>1;
if(mid==0)
break;
if(count(mid)<k){
right=mid-1;
}
else{
left=mid+1;
ans=mid;
}
}
printf("%.2lf",ans/100.0);
}