반응형
문제
도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
입력
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (1 ≤ xi ≤ 1,000,000,000)가 한 줄에 하나씩 주어진다.
출력
첫째 줄에 가장 인접한 두 공유기 사이의 최대 거리를 출력한다.
이분 탐색으로만 풀어야 하는 문제.. 좋은 문제인지는 모르겠다..
N개 정렬시킨 후에 가장 최소는 1 최대는 첫원소와 마지막원소의 차이
최소와 최대 사이에 정답으로 출력해야하는 값이 존재한다.
따라서 이분탐색으로 result를 변경시켜가면서 만약 조건에 부합하면 그 값을 키우고 부합하지 않으면 값을 줄이면서 진행.
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int N, C;
int arr[200000];
bool possible(int dist)
{
int cnt = 1;
int prev = arr[0];
//조건 충족하는지 확인
for (int i = 1; i < N; i++)
if (arr[i] - prev >= dist)
{
cnt++;
prev = arr[i];
}
//조건 충족
if (cnt >= C)
return true;
return false;
}
int main(void)
{
cin >> N >> C;
for (int i = 0; i < N; i++)
{
long long x;
cin >> x;
arr[i] = x;
}
sort(arr, arr + N);
int left = 1;
int right = arr[N - 1] -arr[0];
int result = 0;
while (left <= right)
{
int mid = (left + right) / 2;
if (possible(mid))
{
result = max(result, mid);
left = mid + 1;
}
else
{
right = mid - 1;
}
}
cout << result << endl;
}
반응형
'Algorithm' 카테고리의 다른 글
2019 KAKAO BLIND RECRUITMENT실패율 (0) | 2020.04.24 |
---|---|
6731. 홍익이의 오델로 게임 (0) | 2020.04.24 |
백준 게리맨더링 2 재풀이 (0) | 2020.04.23 |
6719. 성수의 프로그래밍 강좌 시청 (0) | 2020.04.22 |
4613. 러시아 국기 같은 깃발 (0) | 2020.04.21 |