문제풀이/백준
백준 2110 - 공유기 설치
레옹
2021. 10. 10. 08:08
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
int N, C;
int k;
vector<int> arr;
int main() {
cin >> N;
cin >> k;
long int before;
long int totalDst = 0;
long int point;
cin >> point;
arr.push_back(point);
for (int i = 1; i < N; i++) {
long int point2;
cin >> point2;
totalDst += point2 - arr[i - 1];
arr.push_back(point2);
}
sort(arr.begin(), arr.end());
int answer = 0;
// 공유기간의 거리 최솟 값
int start = 1;
// 공유기간의 거리 최댓값
int end = arr[arr.size() - 1] - arr[0];
while (start <= end) {
// 설치한 공유기 갯수의 최대 거리를 찾기
int mid = (start + end) / 2;
int previousHousePos = arr[0];
// 맨 처음 집지점에 공유기 설치
int installCount = 1;
// 집들을 순차적으로 검색
for (int i = 1; i < arr.size(); i++) {
if (arr[i] - previousHousePos >= mid) {
installCount++;
previousHousePos = arr[i];
}
}
// 설치된 공유기 갯수가 계획 된 공유기 설치 갯수보다 많으면
// 탐색 범위를 높임
if (installCount >= k) {
start = mid + 1;
// 설치된 공유기 갯수가 기존 계획 보다 많다 == 현재 공유기 간의 최대 거리가 답보다 작거나 같다
answer = max(answer, mid);
}
// 설치된 공유기 갯수가 계획 된 공유기 설치 갯수보다 낮으면
// 탐색 범위를 좁힘
else {
end = mid - 1;
}
}
cout << answer;
return 0;
}