题目描述
有n条绳子,它们的长度为Li(Li<=1000).如果从它们中切割出K条长度相同的绳子的话,这条绳子每条最长能有多长?答案保留到小数点后2位。
输入
输入包含两行,第一行有两个整数n和k,n代表n条绳子,k代表切割出的长度。
4 11
8 .02 7.43 4.57 5.39
输出
输出能切割出最长的长度maxl。
思路
这个题是二分查找典型的例子,二分枚举0到绳子的最大极限,当满足条件增大maxl的枚举长度,否则就减小l的maxl。
代码
#include<stdio.h>
const int MAXN=1005;
double arr[MAXN];
int n,k;
bool cheak(double L)
{
int sum=0;
for(int i=0;i<n;i++)
{
int x=arr[i]/L;
sum+=x;
}
if(sum>=k) return true;
else return false;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%lf",&arr[i]);
double l=0,r=MAXN;
while(r-l>0.001)
{
double mid=(r+l)/2;
if(cheak(mid)) l=mid;
else r=mid;
}
printf("%0.2f",l);
return 0;
}
/*
4 11
8.02 7.43 4.57 5.39
*/