二分検索/検索(最大化or最小化問題)
2点とは何ですか.
簡単に言えば半分に折って数を探すことです
p
oj 1064
二分探索の終了判断
小数を出力する問題では、一般的に許容される誤差範囲や、出力中の小数点以下の桁数を指定します.
したがって,二分探索を用いるには,精度を満たすために合理的な終了条件を設定しなければならない.
1サイクルでいいでしょう区間を100サイクル半分と1 e-30の精度で縮めて、一般的には問題ありません.
しかし区間が小さすぎると、死の循環を引き起こす可能性が高い.
簡単に言えば半分に折って数を探すことです
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の精度で縮めて、一般的には問題ありません.
しかし区間が小さすぎると、死の循環を引き起こす可能性が高い.