1、二分查找
算法笔记 P127
//无重复
//单增
int binarySearch(int a[],int left,int right,int x)
{
int mid; //在外面建一个变量,省得每次重新创建了。
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]==x) return mid;
else if(a[mid]<x) left=mid+1;//left++;又写错了 //binarySearch(a,mid+1,right,x);写错了
else right=mid-1;//right--;同上 //binarySearch(a,left,mid-1,x); 写错了
}
return -1;
}
2、查找下界
a单增,求第一个大于等于x的元素的位置。
没有的话,返回它应该在的位置。
算法笔记 P128
二分的初始区间为:left=0,right=n。
int low_bound(int a[],int left,int right,int x)
{
int mid;
while(left<right) //left==right时循环结束!
{
mid=(left+right)/2;
if(a[mid]=x) right=mid;
else if(a[mid]<x) left=mid+1;
else right=mid;
}
return left; //return mid; 错了
}
3、查找上界
a单增,求第一个大于x的元素的位置。
没有的话,返回它应该在的位置。
算法笔记 P129
int upper_bound(int a[],int left,int right,int x)
{
int mid;
while(left<right)
{
mid=(left+right)/2;
if(a[mid]>x) right=mid;
else left=mid+1;
}
return left;
}
4、求√2 的近似值
double calSqrt()
{
double left=1;
double right=2;
double mid;
while((right-left)>1e-5)
{
mid=(right+left)/2;
if(mid*mid>2) right=mid //left=mid; 写错了
else left=mid; //right=mid; 写错了
}
return mid;
}
5、求 f(x)=0 的近似解
//f(x)单增,求f(x)=0的根
double solve(double L,double R)
{
double left=L;
double right=R;
double mid;
while((right-left)>1e-5)
{
mid=(right-left)/2;
if(f(x)>0) right=mid;
else left=mid;
}
return mid;
}
6、装水问题 --- 二分
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-5;
double f(double R,double h)
{
double alpha=2*acos((R-h)/h);
double L=2*sqrt(R*R-(R-h)*(R-h));
double S1=alpha*R*R/2-L*(R-h)/2;
double S2=pi*R*R/2;
return S1/S2;
}
double solve(double R,double r)
{
double left=0,right=R,mid;
while(right-left>eps) //- 比 > 优先级更高
{
mid=(right+left)/2;
if(f(R,mid)>r) right=mid;
else left=mid;
}
return mid;
}
int main()
{
double R,r;
cin>>R>>r;
printf("%.4f\n",solve(R,r));
return 0;
}
7、木棒切割问题