也是一次AC!(虽然有一次格式错误但我相信你们不会在意的对吧)

题目传送门

http://noi.openjudge.cn/ch0111/01

思路

  • 特判 如大于所有数据或小于所有数据
  • 其他 用二分法搜索最接近数据,再比较距离,然后输出

代码

/*http://noi.openjudge.cn/ch0111/01*/
#include<bits/stdc++.h>
using namespace std;

// struct record{			本来想用结构体写功能,后来放弃了
// 	long long arrn;
// 	long long arrl;
// 	long long arrr;
// };

long long sch(long long *arr,long long lim,int l,int r){
	int mid=(l+r)/2;
	if(abs(l-r)==1){
		if(abs(lim-arr[l])>abs(lim-arr[r]))
			return arr[r];
		else return arr[l];
	}
	if(lim>arr[r])
		return arr[r];
	if(lim<arr[l])
		return arr[l];
	if(lim==arr[mid])
		return arr[mid];
	if(lim>arr[mid])
		sch(arr,lim,mid,r);
	if(lim<arr[mid])
		sch(arr,lim,l,mid);
}

int main(){

//	freopen("7940.in","r",stdin);

	int n;
	cin>>n;
	long long a[n];
	for(int i=0;i<n;i++)
		cin>>a[i];

	sort(a,a+n);	//防止测试点数据乱序
	
	int m;
	cin>>m;
	long long num[m];
	for(int i=0;i<m;i++){
		cin>>num[i];
		cout<<sch(a,num[i],0,n)<<endl;
	}

}