时间限制 | 空间限制 |
---|---|
1000 ms |
10240 KB |
注意内存限制,该内存限制下无法申请千万级别的数组。
# 题目描述
现在有 只水獭从低到高站成一排。Moca 希望每次能找到不低于某身高 的第一只水獭的编号(编号从 开始),请你编写一个程序完成这个任务。
# 输入格式
第一行两个正整数 和 ,其中 表示小水獭的个数,保证 ; 表示接下来询问的次数,保证 。
接下来一行,输入 个正整数,第 个正整数表示第 只小水獭的身高 ,保证 ,输入的 单调不减。
接下来 行,每行一个正整数 ,表示要查找的值,保证 。
# 输出格式
输出 行,对每次询问,输出对应的不低于对应身高 的第一只水獭的编号;如果不存在这样的水獭输出 -1
。
# 样例输入
5 5 | |
2 7 10 10 13 | |
1 | |
8 | |
10 | |
12 | |
14 |
# 样例输出
1 | |
3 | |
3 | |
5 | |
-1 |
# 题解:二分
二分查找板子题。参考代码:
#include <stdio.h> | |
int n, m, a[500010]; | |
int main() | |
{ | |
// freopen("F.in", "r", stdin); | |
// freopen("F.out", "w", stdout); | |
scanf("%d%d", &n, &m); | |
for (int i = 1; i <= n; ++ i) | |
scanf("%d", &a[i]); | |
while (m -- ) | |
{ | |
int h; | |
scanf("%d", &h); | |
if (h > a[n]) | |
{ | |
puts("-1"); | |
continue; | |
} | |
int l = 1, r = n; | |
while (l < r) | |
{ | |
int mid = (l + r) >> 1; | |
if (h <= a[mid]) | |
r = mid; | |
else | |
l = mid + 1; | |
} | |
printf("%d\n", l); | |
} | |
return 0; | |
} |