题意:有N条绳子,他们的长度分别为Li。如果从他们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长。答案保留到小数点后两位。
思路:二分搜索的模型解决:“求满足某个条件C(x)的最小(大)的x”这一问题。
这个题里
C(x):可以得到K条长度为x的绳子
由于长度为Li的绳子最多可以切出floor(Li / x) 段长度为x 的绳子,因此
C(x):(floor (Li / x) )的总和是否大于或等于K
代码如下
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include<cmath>
using namespace std;
long long N,K;
const int maxn = 1e6+10;
double L[maxn];
int INF = 0x3f3f3f;
bool C(double x)
{
int num=0;
for(int i=0; i<N; i++)
{
num+=(int) (L[i]/x);
}
return num>=K;
}
int main()
{
while(~scanf("%lld %lld",&N,&K))
{
for(int i=0; i<N; i++)
scanf("%lf",&L[i]);
sort(L,L+N);
double lb=0,ub=INF;
for(int i=0; i<100; i++)
{
double mid = (lb + ub)/2;
if(C(mid))
lb=mid;
else
ub=mid;
}
printf("%0.2f\n",floor(ub * 100) /100);
/*输出要注意,不是简单的0.2f就完事。因为会自动四舍五入*/
}
return 0;
}