二分検索/検索(最大化or最小化問題)


2点とは何ですか.
簡単に言えば半分に折って数を探すことです
	       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;
            }
        }

p
oj 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
",floor(r*100)/100); } }

二分探索の終了判断
小数を出力する問題では、一般的に許容される誤差範囲や、出力中の小数点以下の桁数を指定します.
したがって,二分探索を用いるには,精度を満たすために合理的な終了条件を設定しなければならない.
1サイクルでいいでしょう区間を100サイクル半分と1 e-30の精度で縮めて、一般的には問題ありません.
しかし区間が小さすぎると、死の循環を引き起こす可能性が高い.