明显二分答案
那我们来重点讲讲思路:
核心:(二分答案)找n个位置里面间隔大于等于x的个数有没有达到m个(只要把这m个打架的分开就好了)
bool check(int x){
int cnt=1,num=1;//(至少可以放一头牛),(第一位置先方式一头)
for(int i=2;i<=n;i++){
if(a[i]-a[num]>=x){//找n个位置里面间隔大于等于x的个数有没有
//达到m个(只要把这m个打架的分开就好了)
cnt++;
num=i;
}
}
ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m,a[N];
bool check(int x){
int cnt=1,num=1;//(至少可以放一头牛),(第一位置先方式一头)
for(int i=2;i<=n;i++){
if(a[i]-a[num]>=x){//找n个位置里面间隔大于等于x的个数有没有
//达到m个(只要把这m个打架的分开就好了)
cnt++;
num=i;
}
}
return cnt>=m;
}
void solve() {
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int l=-1,r=1e9+1;
while(l+1<r){
int mid=l+r>>1;
if(check(mid))l=mid;
else r=mid;
}
cout<<l<<"\n";
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
solve();
return 0;
}
over~