洛谷-P2249 【深基13.例1】查找
题目描述
输入 n(n≤1e6) 个不超过1e9的单调不减的(就是后面的数字不小于前面的数字)非负整数a1,a2,…,an,然后进行 m(m≤1e5) 次询问。对于每次询问,给出一个整数 q(q≤1e9),要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1。
输入格式
第一行 2 个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
输出格式
m 个整数表示答案。
输入输出样例
输入#1 |
输出#1 |
11 3 1 3 3 3 5 7 9 11 13 15 15 1 3 6 |
1 2 -1
|
题目分析
n最大为1e6可见其数据规模比较大,要进行m(最大1e5)次询问,根据这两个数据可知普通的普通的查找方式是肯定行不通的。数据单调不减数的(数列递增),据此就可以采用二分查找来查询数据了。
可行代码
#include <iostream> using namespace std; int search(int key, int *arr, int len) { int l = -1, r = len, mid; // 注意的是数组是从0开始的 while (l + 1 < r) { mid = l + r >> 1; if (arr[mid] <= key) l = mid; else r = mid; } if (arr[r] == key + 1) return r; // 返回的是大于key的第一个位置 return -1; } int main() { int n, m; cin >> n >> m; int arr[n]; for (int i = 0; i < n; i++) cin >> arr[i]; while (m--) { int key; cin >> key; int loc = search(key-1, arr, n); if (loc == -1) cout << -1; else cout << loc + 1; if (m) cout << ' '; } return 0; }
END 感谢reader's阅读,洛谷题目链接:P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)