概念
二分查找是分治算法的一种




题目练习
查找第一个大于等于target的数据

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[10010];
int erfen(int,int,int);
int main()
{
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>a[i];
}
int target;
cin>>target;
cout<<erfen(target,0,n-1)<<endl;
return 0;
}
int erfen(int target,int l,int r)
{
int res = n-1;
while(l<=r)
{
int mid = (l+r)/2;
if(a[mid]<target) l = mid+1;
else if(a[mid]>=target)
{
res = mid;
r = mid-1;
}
}
return res;
}
查找最后一个小于等于target的数据

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[10010];
int erfen(int,int,int);
int main()
{
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>a[i];
}
int target;
cin>>target;
cout<<erfen(target,0,n-1);
return 0;
}
int erfen(int target,int l,int r)
{
int res = 0;
while(l<=r)
{
int mid = (l+r)/2;
if(a[mid]>target) r = mid-1;
else if(a[mid]<=target)
{
res = mid;
l = mid+1;
}
}
return res;
}
平方根计算

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
float erfen(float,float,float);
int main()
{
float target;
cin>>target;
cout<<erfen(target,0.001,target);
return 0;
}
float erfen(float target,float l,float r)
{
float res = 0;
while(l<=r)
{
float mid = (l+r)/2;
int mid2 = mid/0.001;
mid = mid2*0.001;
// cout<<l<<" "<<mid<<" "<<r<<endl;
// system("pause");
if(mid*mid>target) r = mid-0.001;
else if(mid*mid<target) l = mid+0.001;
if(mid==res) return res;
res = mid;
}
return res;
}