Uva 10474 进来学一学lower_bound
紫薯P108 例题5-1
一、题意
若干组数据。
每组第一行n、q分别表示石头数和询问数。
之后列出n个石头分别代表的数字。
之后q次询问每次一个数x,要求你输出x在这个石头序列排列后的第几个(或者找不到)。
二、解析
排序后用lower_bound
三、代码
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 5;
int n, q, a[maxn], kase = 1;
int main() {
while(cin >> n >> q && (n || q)) {
for(int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
cout << "CASE# " << kase ++ << ":\n";
while(q --) {
int x;
cin >> x;
int idx = lower_bound(a, a + n, x) - a;
if(idx == n || a[idx] != x) cout << x << " not found" << endl;
else cout << x << " found at " << idx + 1 << endl;
}
}
}四、归纳
- lower_bound(start, end, x)是经常用到的函数,作用是在一个排列好的序列中用二分法找到第一个>=x的数字的指针或迭代器,找不到时返回end
- 拓展: upper_bound类似,找到的是第一个>x的位置
Re:从零开始的刷题生活 文章被收录于专栏
一起来重刷题叭~ 由于精力有限,题意只说大概,题目细节可以点击vjudge链接查看。 题目以紫薯中的Uva例题/习题为主,有时候有些比较经典的算法也会特意从其它OJ上找题,并不一定出现在紫薯上。 噢,紫薯指——《算法竞赛入门经典(第2版)》by 刘汝佳 喜欢的小伙伴点个赞呗?不然我只能认为一直只有我一个人在自娱自乐orz....

查看13道真题和解析