查找最接近的元素 求救!

题目描述
在一个非降序列中,查找与给定值最接近的元素

输入格式
第一行一个整数 
�
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 个赞
  1. a数组太小了。

  2. long long r,l 不是 int。

1 个赞

有帮助的话,给个解决方案吧

1 个赞

r=mid 不是mid-1

80分 :cry:

??

mid=(l+r)/2

改了之后TLE了

AC了,谢谢

我改了后还20了

数组小了

AC了谢谢

AC了

@殷芊翊 你怎么抄

AC了,谢谢。