二分搜索
参考资料:
[1]:挑战程序设计竞赛
一、从有序数组中查找某个值
给定长度为n的单调不下降数列a[1,2,3,........,n]和一个数k,球满足a[i] >= k 条件的最小的i。
不存在的情况下输出 n。
1.手动写个二分
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1e5+50; 6 7 int n,k; 8 int a[maxn]; 9 10 int binarySearch() 11 { 12 int l=0,r=n+1; 13 while(r-l > 1)//重复循环,直到解的存在范围不大于 1 14 { 15 int mid=l+((r-l)>>1);//防越界 16 if(a[mid] >= k)//如果mid满足条件,则解的存在范围变为 (l,mid] 17 r=mid; 18 else 19 l=mid;//如果mid不满足条件,则解的存在范围变为(mid,r] 20 } 21 return r == n+1 ? n:r; 22 } 23 int main() 24 { 25 scanf("%d%d",&n,&k); 26 for(int i=1;i <= n;++i) 27 scanf("%d",a+i); 28 sort(a+1,a+n+1);//二分查找要先确保数组有序 29 printf("%d\n",binarySearch()); 30 }
2.调用函数库中的lower_bound(arry+first,arry+last,val)(头文件<algorithm>)
函数lower_bound()在区间[first,last)进行二分查找,返回大于或等于val的第一个元素位置。
如果所有元素都小于val,则返回last的位置。
例如,假设数组 a[6]={1,1,2,2,5,9};
int t=lower_bound(a+0,a+6,2)-a;//在区间[0,6)查找值第一个小于等于2的位置,此处返回 2
int t=lower_bound(a+3,a+6,2)-a;//在区间[3,6)查找,返回3
int t=lower_bound(a+3,a+6,10)-a;//在区间[3,6)查找,不存在大于等于10的数,返回6
题目一览表 | 来源 | 考察知识点 | 完成时间 |
A 1064 Cable master | poj | 假定一个解并判断是否可行 | 2018.10.15 |
B 1759 Garland | poj | 假定一个解并判断是否可行 | 2018.10.17 |
C 2976 Dropping tests | poj | 最大化平均值 | 2018.10.17 |
D 2456 Aggressive cows | poj | 最大化最小值 | 2018.10.15 |
E 3258 River Hopscotch | poj | 最大化最小值 | 2018.12.21 |
F 3061 Subsequence | poj | 可用二分查找 | 2018.10.16 |
G P1163 银行贷款 | 洛谷 | 假定一个解并判断是否可行 | 2019.3.23 |