分析:
二分条件:某个点之后的区间具有什么特殊性质,能够将这个点二分出来。
枚举最小值,判断是否符合条件。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1e5 + 10;
int n, c;
int x[N];
inline int read()
{
int sum = 0, ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9')
{
sum = sum * 10 + ch - '0';
ch = getchar();
}
return sum;
}
bool check(int k)
{
int pos = x[0];
int cnt = 1;
for (int i = 1; i < n; i ++ )
{
if (x[i] - pos >= k)
{
pos = x[i];
cnt ++ ;
}
if (cnt >= c) return true;
}
return false;
}
int main()
{
scanf("%d%d", &n, &c);
for (int i = 0; i < n; i ++ ) scanf("%d", &x[i]);
sort(x, x + n);
//左边界从0开始!!!
int l = 0, r = x[n - 1] - x[0];
int ans = 0;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid, ans = mid;
else r = mid - 1;
}
printf("%d\n", ans);
return 0;
}