通过二分枚举最近距离,通过贪心验证最近距离
#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
#include <queue>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int N, C;
cin >> N >> C;
int pos[N + 1];
for (int i = 0; i < N; i++) {
cin >> pos[i];
}
sort(pos, pos + N);
int L = pos[1] - pos[0], R = pos[N - 1] - pos[0], ans = -1;//L和R分别为最近距离的
while (L <= R) { //最小可能和最大可能
int mid = L + (R - L) / 2;
int last = -mid, cnt = 0;//last初始化为-mid, 用于第一个隔间的计算
for (int i = 0; i < N; i++) {
if (pos[i] - last >= mid) {
cnt++;
last = pos[i];
}
}
if (cnt >= C) {
ans = max(ans, mid);//取最大值
L = mid + 1;
}
else {
R = mid - 1;
}
}
cout << ans << endl;
return 0;
}