题目大概:
给出n根长度不同的木棒,让我们切成长度相同的m根木棒,问切的木棒的最长长度是多少。
思路:
每根木棒的长度和根数成反比。
长度 l =0,,r为木棒总长度除m。mid=(l+r)/2.。
用二分法不断逼近最大的长度即可。
最后取右端点。
代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
double l,r=0,mid;
double sum=0;
double a[100600];
int main()
{int n,m,j=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{scanf("%lf",&a[i]);
sum+=a[i];
}
sum=sum/(double)(m);
l=0;r=sum;
while(r-l>1e-10)
{mid=(l+r)/2;
j=0;
for(int i=0;i<n;i++)
{j+=(int)(a[i]/mid);
}
if(j>=m){l=mid;}
else r=mid;
}
printf("%.2f\n",r=(int)(r*100)/100.0);
return 0;
}