题目链接: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;
}
}