保持距离
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定 n 个坐标 x1,x2,…,xn 请从中挑出 k 个坐标(k 为给定值),使得选出的坐标两两之间的最短距离最大。
输入格式
- 第一行:两个整数 n 与 k
- 第二行:n 个整数 x1,x2,…xn
输出格式
- 单个整数:表示最近距离的最大值
数据范围
- 30% 的数据,n≤12
- 60% 的数据,n≤200
- 100% 的数据,n≤300,000
- 2≤k≤n
- −10^9≤xi≤10^9
样例数据
输入:
5 3
3 2 1 4 5
输出:
2
解析:此题使用二分法,详见代码:
#include <bits/stdc++.h>
using namespace std;
int a[300005];
int k,n;
bool ck(long long x){//检验能否找到k个点使间隔大于等于x
int cnt=1;//第一个点为a[1]
long long p=a[1];//上一个点的坐标
for (int i=2;i<=n;i++){
if (a[i]-p>=x){//找到最近的间隔大于等于x的点
cnt++;
p=a[i];
}
}
return cnt>=k;//判断找到的点是否大于等于k
}
int main() {
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);//排序
long long l=0;
long long r=2*1e9;
while(l<r-1){//二分法求解
long long m=(l+r)/2;
if (ck(m)==1){
l=m;
}else{
r=m;
}
}
cout<<l;
return 0;
}