Solution#
Memo#
- 파라메트릭서치 2
- 없으면 뭔가 방법이 있었을까 싶은데 잘 떠오르지는 않는다.
// Baekjoon - 2110
// https://www.acmicpc.net/problem/2110
use std::io::{self, Read, Write};
fn main() {
let mut stdin = io::stdin().lock();
let mut stdout = io::stdout().lock();
let mut input = String::new();
stdin.read_to_string(&mut input).unwrap();
let mut lines = input.lines();
let first_line = lines.next().unwrap();
let parts: Vec<u64> = first_line
.split_whitespace()
.map(|x| x.parse().unwrap())
.collect();
let n = parts[0];
let c = parts[1];
let mut houses: Vec<u64> = vec![];
for i in 0..n {
let tmp: u64 = lines.next().unwrap().parse().unwrap();
houses.push(tmp);
}
houses.sort_unstable();
let mut left = 1;
let mut right = houses[houses.len() - 1] - houses[0];
let mut result = 0;
while left <= right {
let mid = (left + right) / 2;
if can_install(mid, &houses, c) {
result = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
write!(stdout, "{}", result).unwrap();
}
fn can_install(distance: u64, houses: &[u64], c: u64) -> bool {
let mut count = 1;
let mut last_position = houses[0];
for &house in houses.iter().skip(1) {
if house - last_position >= distance {
count += 1;
last_position = house;
if count >= c {
return true;
}
}
}
false
}