题意n根电缆,分k段,k段相同,让分的段尽可能大
理想状态下最大段=绳长总和除以段数[0,sum/k],在这个区间里,我们求解
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-8
int n,k;
double a[1000000];
int slove_k(double x)//计算当电缆为[0,sum/k]中的数据时,电缆的段数
{
int su=0;
for(int i=0;i<n;i++)
{
su+=a[i]/x;
}
return su;
}
int main()
{
while(~scanf("%d %d",&n,&k)&&(n&&k))
{
double sum=0;
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
sum+=a[i];
}
double l=0,r,mid;//区间的左端点,右端点
r=sum/k;
while(fabs(l-r)>eps)//如果左端点和右端点相差的小于eps
{
mid=(l+r)/2.0;//缩小范围到fabs(l-r)<=eps
if(slove_k(mid)>=k)
l=mid;
else
r=mid;
}
printf("%.2lf\n",l);//取下区间
}
}