简单题意:有n条绳子,分成11段相等的,问能使得最长为多长。
解题思路:直接二分答案,看二分到的值能否被剪成至少k断。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 10000
#define exp 1.0e-9
int n,k;
double num[N],sum,result;
int Count(double len)
{
int count = 0;
for(int i = 0;i < n;i++)
count += int(floor(num[i] / len));
return count;
}
void SecondDiv()
{
double low,mid,high;
low = 0.0;
high = sum;
while(high - low > exp)
{
mid = (high + low) / 2;
if(Count(mid) >= k)
{
result = mid;
low = mid;
}
else
high = mid;
}
}
int main()
{
while(scanf("%d %d",&n,&k) && n + k)
{
sum = 0.0;
for(int i = 0;i < n;i++)
{
scanf("%lf",&num[i]);
sum += num[i];
}
result = 0.0;
SecondDiv();
printf("%.2lf\n",result);
}
return 0;