题目链接:poj1064
/*
题意:
给n条线段,单位为米,要对这些线段裁剪,剪出m条等长的线段,且使
这些线段尽可能地长,结果要精确到厘米,即小数点后两位。不能小于1厘米,
小于1厘米要输出0.00
思路:二分
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 1e6+10;
const double eps = 1e-6;
double a[N],maxx;
int n,m;
void solve()
{
double l = 0, r = maxx;
double ans = 0;
while(r - l > eps)
{
double mid = (l+r)/2.0;
int sum = 0;
for(int i = 0; i < n; i ++)
sum += (int)(a[i]/mid);//计算能分成多少段
if(sum >= m)
l = mid;
else
r = mid;
}
printf("%.2lf\n",int(r*100)*0.01);//直接输出r的话会四舍五入
}
int main()
{
int i;
while(~scanf("%d%d",&n,&m))
{
maxx = 0;
for(i = 0; i < n; i ++)
{
scanf("%lf",&a[i]);
if(a[i] > maxx) maxx = a[i];
}
solve();
}
return 0;
}