POJ1064-二分搜索

二分搜索除了在有序数列查找值上非常有用外,在求最优解也有很大用处。

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)的精度

注意上界要选择一个充分大的数字(这里是>绳子的长度)


参考:《挑战程序设计竞赛》

猜你喜欢

转载自blog.csdn.net/qq_39898780/article/details/80966618