※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2110번 문제인 공유기 설치이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2110
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net
이 문제는 가장 인접한 두 공유기 사이의 거리를 0과 1000000000 사이에서 이분탐색(binary search)을 통해 구하는 것으로 해결할 수 있다..
두 공유기 사이의 거리를 최소 dist 이상으로 두었을 때 설치할 수 있는 최대 공유기의 개수를 구해, 그 개수와 C를 비교하는 것으로 이분탐색을 진행해나갈 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
int N, C;
int arr[200000];
int func(int dist) { // 간격이 dist 이상이게 최대한 설치
int ret = 1;
int old = arr[0];
for (int i = 1; i < N; i++) {
if (arr[i] - old >= dist) {
old = arr[i];
ret++;
}
}
return ret;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> C;
for (int i = 0; i < N; i++) cin >> arr[i];
sort(arr, arr + N);
int L = 0, R = 1000000000;
while (L < R) {
int mid = (L + R) / 2 + 1;
int val = func(mid);
if (val < C) R = mid - 1;
else L = mid;
}
cout << L;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3896 // C++] 소수 사이 수열 (0) | 2021.11.03 |
---|---|
[BOJ 1477 // C++] 휴게소 세우기 (0) | 2021.11.02 |
[BOJ 2819 // C++] 상근이의 로봇 (0) | 2021.10.31 |
[BOJ 1450 // C++] 냅색문제 (0) | 2021.10.30 |
[BOJ 1563 // C++] 개근상 (0) | 2021.10.29 |