题目描述 给出有n个元素的由小到大的整数序列,有Q次询问,对于每次询问,请你编程找出某元素第一次出现的位置,如果该元素不存在,则输出-1。(n,Q<=10^5)。 输入 共4行 第1行:一个整数,表示由小到大序列元素个数; 第2行:下面n行,每行一个整数; 第3行:一个整数q,表示询问的次数。 第4行:有q个整数,表示待查询的整数。 输出 共q个整数,如果查询的数在序列中,则输出它第一次出现的位置,否则输出-1。每个数之间用一个空格隔开。 样例输入 Copy 5 3 5 6 6 7 2 6 4 样例输出 Copy 3 -1
时间: 2024-03-23 14:36:42 浏览: 42
输入两个正整数m和n求其最大公约数和最小公倍数 (2).pdf
以下是一个可能的C++实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, q;
cin >> n;
// 读入序列
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
// 依次回答每个询问
cin >> q;
for (int i = 0; i < q; i++) {
int x;
cin >> x;
// 二分查找x第一次出现的位置
int l = 0, r = n - 1, pos = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (nums[mid] < x) {
l = mid + 1;
} else if (nums[mid] > x) {
r = mid - 1;
} else {
pos = mid;
r = mid - 1;
}
}
// 输出结果
cout << pos << endl;
}
return 0;
}
```
该实现首先读入整数序列,然后对于每个询问,使用二分查找找到元素`x`第一次出现的位置。具体来说,我们在序列中找到第一个等于`x`的元素,并记录它的位置`pos`,然后继续向左二分查找,直到找到第一个小于`x`的元素,以确保`pos`是第一次出现的位置。如果找不到等于`x`的元素,则`pos=-1`,表示该元素不存在。最后,输出每个询问的结果。
阅读全文