01:查找最接近的元素
查看提交统计提问
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个非降序列中,查找与给定值最接近的元素。
输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
程序没有输出。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000+5;
int a[MAXN],r[MAXN];
int compare(int m1,int n1,int x1){
if(m1-x1>n1-x1) return n1;
else return m1;
}
void msort(int s,int t){
if(s==t) return;
int mid=(s+t)/2;
msort(s,mid);
msort(mid+1,t);
int i=s,j=mid+1,k=s;
while(i<=mid&&j<=s){
if(a[i]<a[j]){
r[k]=a[j];j++;k++;
}
else{
r[k]=a[i];i++;k++;
}
}
while(i<=mid){
r[k]=a[i];i++;k++;
}
while(j<=s){
r[k]=a[j];j++;k++;
}
for(i=s;i<=t;i++) a[i]=r[i];
}
int DFind(int s,int t,int m2){
int mid=(s+t)/2;
if(a[s]<m2&&a[t]>m2) return compare(a[s],a[t],m2);
if(a[mid]==m2) return a[mid];
if(a[mid]<m2) return DFind(s,mid,m2);
else return DFind(mid+1,t,m2);
}
int main(){
int n,mn,m[10005];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>mn;
for(int i=0;i<mn;i++){
cin>>m[i];
}
for(int i=0;i<mn;i++){
cout<<DFind(0,n,m[i]);
}
return 0;
}