题目传送门
题意简述:
给定n,m,以及n个距离值a[i]表示给定n个点以及它的距离值,要求选出m个,使得距离最近的两个距离值最大,求出最大值
思路:
因为每个点的距离值确定,所以最近距离的最大值具有单调性,随m增加而减小,二分这个最大值,看能否满足要求选出m个的情况,更新最值
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int n,m,ans;
int a[maxn];
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=(ch=='-')?-1:1,ch=getchar();
while(isdigit(ch)) x=x*10+(ch-'0'),ch=getchar();
return x*f;
}
inline bool judge(int p){
int cnt=1,la=1;
for(int i=2;i<=n;i++)
if(a[i]-a[la]>=p) cnt++,la=i;
if(cnt>=m) return true;
else return false;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+1+n);
int l=1,r=1e9,mid;
while(l<=r){
mid=(l+r)/2;
if(judge(mid)) l=mid+1,ans=max(ans,mid);
else r=mid-1;
}
cout<<ans<<'\n';
return 0;
}