Descripción
El granjero John ha construido un nuevo granero largo, con N (2 <= N <= 100,000) puestos. Los puestos están ubicados a lo largo de una línea recta en las posiciones x1, ..., xN (0 <= xi <= 1,000,000,000).
A sus vacas C (2 <= C <= N) no les gusta este diseño de granero y se vuelven agresivas entre sí una vez que se ponen en un puesto. Para evitar que las vacas se lastimen entre sí, FJ desea asignar las vacas a los establos, de modo que la distancia mínima entre dos de ellas sea lo más grande posible. ¿Cuál es la distancia mínima más grande?
De entrada
* Línea 1: Dos enteros separados por espacios: N y C
* Líneas 2..N + 1: La línea i + 1 contiene una ubicación de bloqueo de enteros, xi
Salida
* Línea 1: un entero: la distancia mínima más grande
Entrada de muestra
5 3
1
2
8
4
9
Salida de muestra
3
Solución
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int a[100005], n=0, c=0;
bool judge(int mid) {
int count=1, t=a[0]; // count畜栏计数器
for (int i=1; i<n; i++)
if (a[i]-t >= mid) { // 选定的相邻两畜栏间距大于猜测距离,则更新计数器
count++; t=a[i];
}
return count >= c;
}
int binarysearch() {
int l=0, r=a[n-1]-a[0]; // 左边界0,右边界为畜栏长度
do {
int mid = l + (r-l)/2; // 防止溢出
if (judge(mid)) l = mid+1; // 左侧逼近
else r = mid-1; // 右侧逼近
} while (l<=r); // 闭区间
return l-1;
}
int main() {
cin >> n >> c;
for (int i=0; i<n; i++)
cin >> a[i];
sort(a,a+n); // 排序
cout << binarysearch() << endl;
return 0;
}