二分搜索除了在有序数列查找值上非常有用外,在求最优解也有很大用处。
eg:“求满足某个条件C(x)的最小x”对于任意x满足C(x),那么x'>=x,也满足C(x')的话就可以用二分查找...详见《挑战程序设计竞赛》第三章
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
double line[10005];
int n,k;
void cut()
{
double up=200005;
double down=0;
double mid;
for(int i=0;i<100;i++)//利用i来保证解的范围足够小,太强了吧
{
mid=(up+down)/2;
int s=0;
for(int i=0;i<n;i++)s+=(int)(line[i]/mid);
if(s<k)up=mid;
else if(s>=k) down=mid;
}
printf("%.2f\n",floor(up*100)/100);
}
int main()
{
while(scanf("%d%d",&n,&k)!=-1)
{
for(int i=0;i<n;i++)
scanf("%lf",&line[i]);
cut();
}
return 0;
}
临界条件太巧妙了吧!
1次循环可以把区间缩小一半,100次可以达到10^(-30)的精度
注意上界要选择一个充分大的数字(这里是>绳子的长度)
参考:《挑战程序设计竞赛》