从有序数组中查找某个值 low_bound

        二分搜索

题意:

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


posted on 2017-08-17 18:07  yjbjingcha  阅读(363)  评论(0编辑  收藏  举报

导航