题目描述
在一个上升序列中,查找刚刚小于给定值k的元素。如样例1:2 5 6 8 9 中刚刚比7小的数是6(数据保证存在)
输入
第一行包含一个整数n,为上升序列长度。1 ≤ n ≤ 100000。
第二行包含n个整数,为上升序各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的次数。1 ≤ m ≤ 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为刚刚小于给定值k的元素。
样例输入
5 2 5 6 8 9 3 7 9 18
样例输出
6 8 9
C++:
#include<iostream>
using namespace std;
int n,m,a[100005],k;
int bs(int low,int high,int k){
while(low<=high){
int mid=(low+high)/2;
if(a[mid]==k)return a[mid-1];
else if(a[mid]<k)low=mid+1;
else if(a[mid]>k)high=mid-1;
}
return a[high];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++){
cin>>k;
if(k==a[n])
cout<<a[n-1]<<endl;
else if(k>a[n])
cout<<a[n]<<endl;
else
cout<<bs(1,n,k)<<endl;
}
return 0;
}