题目来源:A-KNN算法_"华为杯"华南理工大学程序设计竞赛(同步赛) (nowcoder.com)
解题算法:
二分查找
使用到函数返回对应元素迭代器的位置,找不到则返回尾迭代器
lower_bound() :寻找>=x的第一个元素的位置
upper_bound():寻找>x的第一个元素的位置
解题思想:
每一次二分通过查找mid的值去确定在关于x加减mid的绝对值的范围内会在a数组中出现几个
最后二分返回的是最小的可以满足第几个靠近x的mid的值,正是因为出现了最小的mid的值才会恰好刚刚出现x距离靠近的哪一个,最后返回的就是daan
答案代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int N = 1e6+10;
int n,q;
int a[N];
signed main()
{
cin >> n >> q;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a+1+n);
while(q--){
int x,y;
int ans=2e9;
int l=0,r=2e9;
cin >> x >> y;
while(l<r){
int mid=(l+r)/2;
int ll=lower_bound(a+1,a+1+n,x-mid)-a;
int rr=upper_bound(a+1,a+1+n,x+mid)-a;
if(rr-ll>=y){
r=mid;
ans=mid;
}
else{
l=mid+1;
}
}
cout << ans <<endl;
}
return 0;
}