题意:给你n个x轴上的点,选择一个组合包含m个点,使得这个组合里面的相邻两点的距离的最小值,是所有组合里面同情况最大的。
#include<iostream>
#include<stack>
#include<vector>
#include<string>
#include<cstring>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll cow[N];//牛牛的数量
ll n,m;//n 为栅栏数,m为要放多少牛子
bool check(int k){
int cnt_cow = 1, dist = cow[0]; // 把最小的牛子放进去 记录他的坐标dist 已经放cnt_cow (1)头牛
for(int i = 1; i < n; i++){
if(cow[i] - dist >= k){//可以放的情况
cnt_cow++;
if(cnt_cow == m) return true;//可以放的情况
dist = cow[i];
}else{
continue;//放不下可以继续找一头牛子
}
}
return false;
}
void solve(){
int l = 1, r = cow[n-1] - cow[0];
while(l < r){
int mid = (l + r) >> 1;
if(check(mid)) l = mid + 1;
else r = mid;
}
cout << r - 1 << endl;
}
int main() {
cin >> n >> m;
for(int i = 0; i < n; i++) cin >> cow[i];
sort(cow,cow+n);
solve();
//system("pause");
return 0;
}