P2249查找
输入 n 个不超过 109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,…,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 1;
int x[N];
int n, m, q;
int main()
{
bool isfirst = true;
int *p, pos;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d", x + i);
sort(x, x + n);
while (m--)
{
scanf("%d", &q);
p = lower_bound(x, x + n, q);
if (*p == q)
{
pos = p - x + 1;
}
else
pos = -1;
if (isfirst)
{
isfirst = false;
printf("%d", pos);
}
else
{
printf(" %d", pos);
}
}
printf("\n");
return 0;
}
直接用二分搜索,有种特殊情况会超时:数据中所有的数据都是1,查找1,那么第一次计a[mid]==1就成立。然后指向mid位置的指针要一直往前判断,是否仍然等于1。一直比较到第一个位置就会超时。
