1.方法(1)
#include <iostream>#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int han( int a[],int n,int p)
{
for(int i=1; i<=n-1; i++)
{
int l=0 ,r=n-1;
while(l<=r)
{
int mid=l+(r-l)/2;
if (p==a[mid]) return mid;
else if(p>a[mid]) l=mid+1;
else r=mid-1;
}
return -1;//找不到返回-1
}
}
int main()
{
int n,i,j,m,k,a[10000];
cin>>n>>m;
for(int i=n; i<m; i++ )
{
cin>>a[i];}
han(a,n,m);
}
2 方法2
#include <iostream>#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int han( int a[],int n,int p)
{
for(int i=1; i<=n-1; i++)
{
int l=0 ,r=n-1,last=-1;
while(l<=r)
{
int mid=l+(r-l)/2;
if (p<=a[mid]) r=mid-1;
else {last=mid;
l=mid+1;
}
}
return last;
}
}
int main()
{
int n,i,j,m,k,a[10000];
cin>>n>>m;
for(int i=n; i<m; i++ )
{
cin>>a[i];}
han(a,n,m);
}
3.最大值与最小值二分法
#include<iostream>
using namespace std;
bool judge(int mid)//判断是否符合条件
{
for(循环)
{
求解计数结果num,++num;
}
if(num与题目边界条件)
return true;
else
return false;
}
int main()
{
int l, r, ans = 0;
l = ;//l和r的具体值要看题目是需要枚举的什么
r = ;
while(l <= r)
{
int mid = (l+r)/2;//mid = l + (r-l)/2
if(judge(mid))
{
ans = mid;
l = mid + 1;//也有可能不是1,可能是一个小数,要看具体的间距
}
else
r = mid -1;
}
cout << ans << endl;
return 0;
}