NOI-1.11查找最接近的元素

题目链接:http://noi.openjudge.cn/ch0111/01/

描述

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

输入

第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。

输出

m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

样例输入

3
2 5 8
2
10
5

样例输出

8
5

暴力肯定超时(一开始我试了。。。),但是二分就很容易了

对于一组数据,首先将他排好序,然后开始找,每找到一个数字,比较一下它与目标key值之间的关系,缩小范围,

最后会给出两个数,比较一下那个更加合适,输出,十分简单的一道基础题:

ac:

//一页 27行就很舒服 
#include<stdio.h>
#include<string.h>  
#include<math.h>  
  
//#include<map>   
//#include<set>
#include<deque>  
#include<queue>  
#include<stack>  
#include<bitset> 
#include<string>  
#include<iostream>  
#include<algorithm>  
using namespace std;  

#define ll long long  
#define INF 0x3f3f3f3f  
#define mod 998244353
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b) 
#define clean(a,b) memset(a,b,sizeof(a))// 水印 
//std::ios::sync_with_stdio(false);

int arr[100010];

bool cmp(int a,int b)
{
	return a<b;
}

int main()
{
	std::ios::sync_with_stdio(false);
	int n,m;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>arr[i];
	sort(arr,arr+n,cmp);
	cin>>m;
	for(int i=0;i<m;i++)
	{
		int key;
		cin>>key;
		int r=n-1,l=0,mid,res=INF;
		while(r-l>1)
		{
			int mid=(l+r)>>1;
			if(arr[mid]>key)
				r=mid;
			else
				l=mid;
		}
		int ans=abs(arr[l]-key)>abs(arr[r]-key)?r:l;
		cout<<arr[ans]<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40482358/article/details/81700615