现在的位置: 首页 > 综合 > 正文

二分搜索/查找(最大化or最小化问题)

2017年06月07日 ⁄ 综合 ⁄ 共 820字 ⁄ 字号 评论关闭

什么是二分?

简单点说就是折半寻找一个数

	       double l=0,r=INF;//头尾
        for(int i=0; i<100; i++)//重复循环似的范围住够小
        {
            double mid=(l+r)/2;
            if(ac(mid))//判断是否可行
            {
                l=mid;
                cout<<mid<<endl;
            }
            else {r=mid;
                cout<<mid<<endl;
            }
        }

poj 1064

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,k;
double L[10005];
bool ac(double x)
{
    double sum=0;
    for(int i=0; i<n; i++)
        sum+=(int)(L[i]/x);//只可能是整数根绳子
    return sum>=k;
}
int main()
{
    while(cin>>n>>k)
    {
        double max=0;
        for(int i=0; i<n; i++)
        {
            cin>>L[i];
            if(max<L[i])
                max = L[i];
        }

        double INF = max ;//把上界设为最大的 方便查找
        double l=0,r=INF;//头尾
        for(int i=0; i<100; i++)//重复循环似的范围住够小
        {
            double mid=(l+r)/2;
            if(ac(mid))
            {
                l=mid;
                cout<<mid<<endl;
            }
            else {r=mid;
                cout<<mid<<endl;
            }
        }
        printf("%.2lf\n",floor(r*100)/100);
    }
}

二分搜索的结束判断

在输出小数的问题中,一般都·会指定允许的误差范围或者是指点输出中小数点后面的位数。

因此在使用二分搜索是,有必须设置合理的结束条件来满足精度

1次循环可以吧区间缩写一半 100循环和缩写到1e-30的精度,一般来说没有问题。

但是区间如果取得过小,很可能造成死循环

抱歉!评论已关闭.