思路:二分法,最后再逐一检验下。
#include <iostream>
#include <cstdio>
using namespace std;
int length[10005];
int main(int argc, char** argv)
{
int n,k,i;
double tmp;
int left,right,mid,sum;
while (scanf("%d%d",&n,&k)==2)
{
right=-1;
for (i=1;i<=n;i++)
{
scanf("%lf",&tmp);
length[i]=(int)((tmp+0.005)*100);
right=max(length[i],right);
}
left=0;
while (left+1<right)
{
mid=(left+right)>>1;
for (i=1,sum=0;i<=n;i++)
sum+=length[i]/mid;
if (sum<k)
right=mid-1;
else
left=mid;
}
for (left+=1;;left++)
{
for (i=1,sum=0;i<=n;i++)
sum+=length[i]/left;
if (sum<k)
break;
}
left--;
printf("%.2lf\n",(double)left/100.0);
}
return 0;
}