分析:
首先考虑暴力算法,对于每个q,如果每次都遍历n,则时间复杂度O(n²),对1<q,n<100000这种数量级来说,取极限值必然超时。
因此采用二分搜索。首先将x数组排序,(二分搜索要保证序列有序)。所以问题转化为,对每次询问q,在商店序列x中二分搜索合适的区间。
代码:
/*
Input
5
3 10 8 6 11
4
1
10
3
11
Output
0
4
1
5
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int n, q;
int x[maxn];
int m[maxn];
int BinarySearch(int ele) {
int ll = 0;
int hh = n;
int mm;
while (ll < hh) {
mm = ll + (hh - ll) / 2;
if (x[mm] <= ele) {
ll = mm + 1;
}
else if (x[mm]>ele) {
hh = mm;
}
}
return ll;
}
int main() {
scanf("%d", &n);
for (int i = 0; i<n; ++i) {
scanf("%d", &x[i]);
}
scanf("%d", &q);
for (int i = 0; i<q; ++i) {
scanf("%d", &m[i]);
}
sort(x, x + n);
for (int i = 0; i<q; ++i) {
printf("%d\n", BinarySearch(m[i]));
}
return 0;
}