二分搜索
题意:
给定长度为n的单调不下降数列a0, ...an-1和一个数k,求满足ai>=k条件的最小的i。不存在的情况下输出n。
输入:
5 3
2 3 3 5 6
输出:
1
#include <cstdio>
using namespace std;
int n, k;
int a[1000000 + 10];
void solve()
{
//初始化解的存在范围
int lb = -1, ub = n;
//重复循环,直到解的存在范围不大于1
while (ub - lb > 1){
int mid = (lb + ub) / 2;
if (a[mid] >= k){
//如果mid满足条件,则解的存在范围变为(lb, mid]
ub = mid;
}
else{
//如果mid不满足条件,则解的存在范围变为(mid, ub]
lb = mid;
}
}
//这时,lb + 1 = ub
printf("%d\n", ub);
}
int main()
{
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
solve();
return 0;
}
//这种算法被称为二分搜索。此外,STL以low_bound函数的形式实现了二分搜索。