///2.假定一个解并判断是否可行
///POJ1064
/**
Q:有N条绳子,长度分别为Li,从中切割出k条长度相同的绳子,
这K条绳子最长能有多长?保留两位小数
A:
二分搜索模型。
条件C(x):=可以得到K条长度为x的绳子
问题转变为 求满足C(x)的最大x;lb=0 ub=INF
问题转变为 如何高效的判断C(x)
1.二分搜索模型:在求最优解问题上的应用
“求满足条件C(x)的最小x”->若所有的x'>=x也满足C(x),则可用二分搜索来解决
*/
#include"iostream"
#include "cstdio"
#include "cmath"
using namespace std;
#define MAX 100010
#define INF 0x3f3f3f3f
int N,K;
double L[MAX];
bool C(double x)
{
int num=0;
for(int i=0;i<N;i++)
{
num+=(int)(L[i]/x);
}
return num>=K;
}
void solve()
{
///初始化解的范围
double lb=0.0,ub=INF;
///重复循环,直到解的范围足够小
for(int i=1;i<=100;i++)
{
double mid=(lb+ub)/2;
if(C(mid))
lb=mid;///长度还可以大点
else
ub=mid;
}
printf("%.2f\n",floor(ub*100)/100);///保留两位小数处理,ub代表最大符合
}
int main()
{
while(~scanf("%d%d",&N,&K))
{
for(int i=0;i<N;i++)
{
scanf("%lf",&L[i]);
}
solve();
}
return 0;
}
/**
4 11
8.02
7.43
4.57
5.39
Sample Output
2.00
*/