什么是二分?
简单点说就是折半寻找一个数
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\n",floor(r*100)/100);
}
}
二分搜索的结束判断
在输出小数的问题中,一般都·会指定允许的误差范围或者是指点输出中小数点后面的位数。
因此在使用二分搜索是,有必须设置合理的结束条件来满足精度
1次循环可以吧区间缩写一半 100循环和缩写到1e-30的精度,一般来说没有问题。
但是区间如果取得过小,很可能造成死循环