这是到挺有意思的题,做为饭后消食还是不错的选择
首先题目说不降序列也就是说序列是有序的呢就好办了,直接二分
分析易知,和一个数\(x\)最接近的数只有三种情况
- 大于\(x\)的数中最小的
- 小于\(x\)的数中最大的
- \(x\)本身
首先我这么懒的人肯定是不想手写二分的所有目光自然就落了lower_bound()
和 upper_bound()
上
然后upper_bound()
得到的结果是大于\(x\)的数中最小的,所以upper_bound()
更合适
呢么令\(t\)是二分出来的数的下标,呢么\(t-1\),要么就是\(x\),要么就是小于\(x\)的数中最大的,比较一下就好
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n , m , a[N] , t , s ;
inline int read()
{
register int x = 0;
register char ch = getchar();
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >= '0' && ch <= '9' )
{
x = ( x << 1 ) + ( x << 3 ) + ch - '0';
ch = getchar();
}
return x;
}
int main()
{
n = read();
for( register int i = 1 ; i <= n ; i ++ ) a[i] = read();
m = read();
for( register int i = 1 ; i <= m ; i ++ )
{
s = read();
if( s < a[1] )
{
printf( "%d\n" , a[1] );
continue;
}
if( s > a[n] )
{
printf( "%d\n" , a[n] );
continue;
}
t = upper_bound( a + 1 , a + 1 + n , s ) - a;
if( a[t] - s < s - a[t - 1] ) printf( "%d\n" , a[t] );
else printf( "%d\n" , a[ t - 1 ] );
}
return 0;
}