思路
先将所有牛按位置排序。随后二分间隔的最大值。check的时候如果位置不够加了,那么需要的间隔就加。
代码
#include<bits/stdc++.h>
#define debug(x) cout<<"x="<<x<<endl
#define int long long
using namespace std;
const int maxn=1e5+7;
const int mod=1e9+7;
typedef long long ll;
//ifstream mycin("in.txt");
//ofstream mycout("out.txt");
inline void read(int &data){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=f*-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
data=x*f;
}
int n,m,a[maxn];
bool check(int x){
int num=1,now=a[1],idx=1;
for(int i=2;i<=n;i++){
if(a[i]-a[idx]>=x) num++,idx=i;
}
if(num>=m) return true;
else return false;
}
signed main(){
read(n);read(m);
for(int i=1;i<=n;i++) read(a[i]);
sort(a+1,a+1+n);
int l=0,r=1e9+7,mid;
while(r-l>1){
mid=l+r>>1;
if(check(mid)) l=mid;
else r=mid;
}
cout<<l<<endl;
return 0;
}

京公网安备 11010502036488号