[二分法]求解递增序列中与x最接近元素问题
题目描述
在一个非降序列序列中与给定值 x 最接近的元素
输入描述
第一行包含一个整数 n,为非降序列长度 (1<=n<=100 000)
第 2 行包含 n 个整数,为非降序列的各个元素, 所有元素的大小均在 0~1 000 000 000 范围内。
第 3 行包含一个整数 m, 为要询问的给定值的个数 (1<=m<=10 000)。接下来 m 行,每行一个整数, 为要询问最接近元素的给定值,所有给定值的大小均在 0~1 000 000 000 范围内。
输出描述
输出共 m 行,每行一个整数,为最接近相应给定值的元素值,并保持输入顺序。若有多个元素值满足条件,输出最小的一个。
输入样例
Copy to Clipboard
3
2 5 8
2
10
5
输出样例
Copy to Clipboard
8
5
//已过OJ #include <iostream> using namespace std; int main(){ int i,mid,m,n,ask; int a[100000]; cin>>n; for(i=1;i<=n;i++){ cin>>a[i]; } cin>>m; for(i=1;i<=m;i++){ cin>>ask; if(ask<a[1]){ cout<<a[1]<<endl; continue; } if(ask>a[n]){ cout<<a[n]<<endl; continue; } int l=1,r=n; while(l<r){ mid=(l+r)/2; if(a[mid]>=ask)r=mid; else l = mid+1; } if(a[l]==ask||(a[l]-ask)<(ask-a[l-1])){ cout<<a[l]<<endl; } else{ cout<<a[l-1]<<endl; } } return 0; }

浙公网安备 33010602011771号