给出n个位置,从中选出k个,让这k个位置相邻两个之间的距离尽可能的大,尽可能大的意思是这k-1个距离的最小值尽量大。输出这个最大的最小值。
样例解释:选位置:1 5 9。
输入
第一行:2个数n和k(2 <= n <= 100000, 2 <= k <= 10000, k <= n)
后面n行:每行一个数Pi,表示具体位置(0 <= Pi <= 10^9),位置是无序的。
输出
输出一个数,对应最大的距离。
输入样例
5 3
1
3
5
7
9
输出样例
4
二分距离
#include<bits/stdc++.h>
using namespace std;
int a[100010],maxn,n,k;
int judge(int x)
{
int num=1,s=a[1];
for(int i=2;i<=n;i++)
if(a[i]-s>=x)
{
s=a[i];num++;
if(num>=k)
return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
int l=0,r=a[n],mid;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid))
{
l=mid+1;maxn=mid;
}
else r=mid-1;
}
cout<<maxn;
return 0;
}
在这里插入代码片