依靠二分求最大值(二分一般都是极大值吧,就算满足条件还可以在区间内分啊分,分到一个最大的)
给定一些线段的长度,让你把他平均分成k份,问你分成最大的线段是多少,
要求后两位绝对精确,不要四舍五入。。。
wa了十几次,收获很大。
floor函数
floor(x),有时候也写做Floor(x),其功能是“下取整”,或者说“向下舍入”,即取不大于x的最大整数
(与 “四 舍 五入”不同,下取整是直接去掉小数部分),例如:
x=3.14,floor(x)=3
y=9.99999,floor(y)=9
在C语言的库函数中,floor函数的语法如下:
#include
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
/*二分
有n个线段,把他们分成k份,
问最大的长度。
求这种方法适合
*/
const int maxn=100806;
double a[maxn];
int m,k;
bool solve(double d)
{ int sum=0;
for(int i=0;i<m;i++)
sum+=a[i]/d;
return sum>=k;
}
int main()
{
while(~scanf("%d%d",&m,&k))
{ for(int i=0;i<m;i++)
scanf("%lf",&a[i]);
double r=200000.0;
double l=0;
for(int i=1;i<=100;i++)
{ double mid=(r+l)/2;
if(solve(mid))
l=mid;
else
r=mid;
}
int res=r*100;
double sum=double(res)*0.01;
printf("%.2lf\n",sum);
//printf("%.2f\n",floor(r*100)/100);
}
return 0;
}