[POJ 2456] Vacas agresivas (dicotomía)

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;
}

 

Publicado 21 artículos originales · elogiado 8 · visitas 1495

Supongo que te gusta

Origin blog.csdn.net/K_Xin/article/details/87863891
Recomendado
Clasificación