카테고리 없음
[C++ 백준 문제풀이] 공유기 설치
mindun
2024. 10. 9. 19:23
반응형

[ 문제 이해 ]
집의 좌표가 n 개 만큼 입력된다.
공유기의 개수가 입력된다.
가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치한다.
[ 문제 전략 ]
공유기 사이의 최소 거리를 설정 한 다음, 그 거리를 조정 해 나가면서
조건에 맞는 거리의 최대값을 구하기로 했다.
그러려면 이분 탐색으로 시작점을 첫 번째 집, 마지막 점을 집의 마지막 좌표로 설정했다.
조건에 맞는 거리의 최대값이라고 하면 이해하기 어려운데,
총 공유기의 개수 만큼 공유기를 설치 했다면 조건에 맞는 거리가 되는 것이고
조건에 맞는 거리 중, 우리는 가장 인접한 두 공유기 사이의 거리를 가능한 크게 설치해야 하므로
최대값을 구하려는 의도이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int n, c;
std::cin >> n >> c;
std::vector<long long> h(n, 0);
for (int i{ 0 }; i < n; i++) {
std::cin >> h[i];
}
std::sort(h.begin(), h.end());
if (c == 2) {
std::cout << h[n - 1] - h[0] << "\n";
return 0;
}
int e = h[n-1];
int s = 0, mid;
int ans = 0;
while (s < e) {
mid = (s + e) / 2;
int k = 1;
long long b = h[0];
int cnt = 1;
while (k < n && cnt < c) {
if (h[k] - b >= mid) {
cnt++;
b = h[k];
}
k++;
}
if (cnt < c) {
e = mid;
}
else {
ans = std::max(ans, mid);
s = mid + 1;
}
}
std::cout << ans << "\n";
}반응형