二分搜索
题意:
给定长度为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 ", 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函数的形式实现了二分搜索。