题目描述
在一个非降序列中,查找与给定值最接近的元素
输入格式
第一行一个整数
�
n,第二行
�
n 个整数
�
�
a
i
表示要查找的有序数列,第三行若干个整数
�
�
m
i
表示要询问最接近元素的给定值(最多有
�
S 个)。
输出格式
对于每一个
�
�
m
i
,输出其最接近相应给定值的元素值,若有多个值满足条件,输出最小的一个,用空格间隔。
样例
Input 1
4
2 5 9 10
1 2 3 7
Output 1
2 2 2 5
样例解释
给定的序列为[2, 5, 9, 10],要找到与给定值7最接近的元素。在该序列中,与给定值最接近的元素是5,因此输出为5。
数据范围
0
<
�
≤
1
0
6
0<n≤10
6
,
0
≤
�
�
≤
1
0
9
0≤a
i
≤10
9
,
0
≤
�
�
≤
1
0
9
0≤m
i
≤10
9
,
0
<
�
≤
10000
0<S≤10000。
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],x;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
while(cin>>x){
int l=1,r=n;
while(l<r){
int mid=(l+r+1)/2;
if(x>=a[mid])l=mid;
else r=mid-1;
}
if(a[l]==x)cout<<l<<" ";
else cout<<"0"<<" ";
}
return 0;
}WA了
2 个赞
�什么?
1 个赞
改成
if(abs(a[l]-x)<=abs(a[r]-x)){
cout<<a[l]<<" ";
}
else{
cout<<a[r]<<" ";
}
2 个赞
改成
while(l+1<r)
2 个赞
mid=(l+r)/2
2 个赞
老师上课讲了
1 个赞
-
a数组太小了。
-
long long r,l 不是 int。
1 个赞
有帮助的话,给个解决方案吧
1 个赞
r=mid 不是mid-1
80分
??
mid=(l+r)/2
改了之后TLE了
AC了,谢谢
我改了后还20了
数组小了
AC了谢谢
AC了
AC了,谢谢。