您的位置:首页 > 其它

二分法细节

2014-07-18 09:01 92 查看
总结:1.本题目中的upper_bound函数中的L=m+1;语句使得(如果V存在于数组中)最后返回值的比v所在坐标值大1(体现v出现的最大位置);

2.本题目的lower_bound函数是确定v在数组中出现的最小位置(如果存在的话);

3.本题目中v如果在数组中有多个则在区间[lower_bound,upper_bound)(左闭右开);

4.如果不能在该值的话:则upper_bound等于lower_bound,区间为空;

5.upper_bound和lower_bound函数本身就是c++的库函数。

#include<stdio.h>

int num[]={3,5,7,9,10,10,10,12,15,20,25,30};//10个数

int lower_bound(int *A,int L,int R,int V)

{

int m;

while(L<R)

{

m=L+(R-L)/2;

if(A[m]>=V) R=m;//所求点在中点以左

else L=m+1;//所求点在中点以右

}

return L;

}

int upper_bound(int *A,int L,int R,int V)

{

int m;

while(L<R)

{

m=L+(R-L)/2;

if(A[m]<=V) L=m+1;//在中点以右

else R=m;//在中点以左

}

return L;

}

int main()

{

int num1;

int n=10;

while(n--)

{

scanf("%d",&num1);

int l=lower_bound(num,0,11,num1);

int r=upper_bound(num,0,11,num1);

if(num[l]==num1&&num[r]==num1)  printf("yes\n");

else printf("%d  %d\n",num[l],num[r]);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: