用c++语言二分法写以下程序: 题目描述 输入 n 个不超过 10^9的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,......,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1 。 输入格式 第一行 2 个整数 n 和 m,表示数字个数和询问次数。 第二行 n 个整数,表示这些待查询的数字。 第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。 输出格式 输出一行,m 个整数,以空格隔开,表示答案。 本题输入输出量较大,请使用较快的 IO 方式。
时间: 2023-06-26 19:05:41 浏览: 226
以下是使用 C++ 语言二分法解决这个问题的程序:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000005;
int n, m;
int a[N];
int binary_search(int q) {
int l = 1, r = n;
while (l < r) {
int mid = (l + r) / 2;
if (a[mid] >= q) r = mid;
else l = mid + 1;
}
if (a[l] == q) return l;
else return -1;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + 1, a + n + 1);
for (int i = 0; i < m; i++) {
int q;
scanf("%d", &q);
printf("%d ", binary_search(q));
}
return 0;
}
```
首先,我们读入序列的长度 `n` 和询问的次数 `m`,以及序列中的所有数字。
然后,我们将这些数字从小到大排序,这样就可以使用二分法查找数字了。对于每一个查询,我们使用二分法找到第一个大于等于查询数字的位置,如果这个位置上的数字与查询数字相等,就说明查询数字在序列中出现过,返回查询数字的位置;否则,查询数字在序列中没有出现过,返回 -1。
最后,我们输出所有查询的结果。
阅读全文