题目描述
肥成和一群喵站成一排,他们身上都有一个数字。请你将喵们按照从小到大的顺序排好队,并求大于等于肥成的数字的最小值是多少,如果不存在,请输出0?
输入数据不保证有序!
输入格式
第一行两个整数N,T,代表共有N只喵,T次询问。
第二行是N个整数,代表N只喵的数字。
第三行是T个整数,代表每次询问时肥成的数字。
数据范围
对于50%50%的数据有1≤n≤1000,1≤a[i]≤1000,T≤1000。
对于100%100%的数据有1≤n≤100000,1≤ai≤100000,T≤1000。
输出格式
对于每次询问,输出一个数字,占一行,为大于等于肥成的数字的最小值,如果不存在,请输出0。
样例解释
样例输入
10 3 1 3 4 4 5 8 8 10 10 10 4 6 10
样例输出
4 8 10
样例输入
5 3 2 5 9 7 13 1 100 8
样例输出
2 0 9
题目分析:可用的方法很多,这里用二分算法,递归函数实现
#include <iostream>
#include <algorithm>
static unsigned int binary_search(unsigned int* range, unsigned int head, unsigned int rear, unsigned int target) {
register unsigned int middle = (head + rear) / 2; //计算中间下标
if (range[middle] > target) {
if (middle == 0) {
return range[middle];
}
else if (range[middle - 1] < target) {
return range[middle];
}
else if (range[middle - 1] == target) {
return range[middle - 1];
}
else {
return binary_search(range, head, middle, target);
}
} //中间值大于目标的情况
else if (range[middle] < target) {
if (middle == rear) {
return 0;
}
else if (range[middle + 1] >= target) {
return range[middle + 1];
}
else {
return binary_search(range, middle, rear, target);
}
} //中间值小于目标的情况
else{
return range[middle];
} //中间值等于目标的情况
}
int main() {
register unsigned int n, t, * a, temp; //声明储存变量
std::cin >> n >> t;
a = new unsigned int[n]; //根据要求申请空间作线性表数组
for (register unsigned int i = 0; i < n; i++) {
std::cin >> a[i];
}
std::sort(a, a + n); //排序
for (register unsigned int i = 0; i < t; i++) {
std::cin >> temp;
std::cout << binary_search(a, 0, n - 1, temp) << "\n"; //进行二分查找
}
return 0;
}