https://vjudge.net/problem/HDU-1551
给定m个木棍,问你把这m个棍子中,分割成至少k个木棍。问能分割的最大长度是多少。
二分,经典的 最大化。
但是有一个细节,就是挑战上,是取的r作为结果,最后再取floor。(截取),这一点没看懂qwq。
而再网上看的其他代码,就是正常写。
#include <cstdio>
#include <cmath>
using namespace std;
const int M=10005;
const double inf=200005.0;
const double eps=1e-8;
double L[M];
int n,k;
bool judge(double x)
{
int num=0;
for(int i=0;i<n;i++)
num+=(int)(L[i]/x);
return num>=k;
}
void solve(double jj)
{
double l = 0,r = inf;
while(fabs(l-r)>eps)
{
double mid = (l+r)/2;
if(judge(mid))
l = mid;
else
r = mid;
}
printf("%.2f\n",l);
}
int main()
{ double sum;
while(scanf("%d%d",&n,&k)!=-1)
{
if(!n&&!k)break;
sum=0;
for(int i=0;i<n;i++){
scanf("%lf",&L[i]);
sum+=L[i];
}
sum=sum/k;
solve(sum);
}
return 0;
}