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
- 이분탐색 (cnt >= C)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, C;
int arr[200001];
cin >> N >> C;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr + N);
int left = 0;
int right = arr[N - 1];
int answer = -21e8;
// 첫집은 무조건 설치해야 최대거리 구할수 있음
while (left <= right) {
int before = 0;
int cnt = 1;
int middle = (left + right) / 2;
for (int i = 1; i < N; i++) {
if (arr[i] - arr[before] >= middle) {
before = i;
cnt++;
}
}
// cnt == C가 아니라 cnt >= C가 맞음 (최소길이만 비교하면 되기 때문)
if (cnt >= C) {
if (middle > answer)
answer = middle;
left = middle + 1;
}
else {
right = middle - 1;
}
}
cout << answer;
return 0;
}
- dfs (시간초과)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, C;
int arr[200001];
int path[200001];
int MAX = -21e8;
void dfs(int le, int st) {
if (le == C) {
int MIN = 21e8;
for (int a = 1; a < C; a++) {
MIN = min(MIN, (path[a] - path[a - 1]));
}
if (MIN > MAX)
MAX = MIN;
return;
}
for (int i = st; i < N; i++) {
path[le] = arr[i];
dfs(le + 1, i + 1);
}
}
int main() {
cin >> N >> C;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr + N);
path[0] = arr[0];
dfs(1,1);
cout << MAX;
return 0;
}
'APS > 백준' 카테고리의 다른 글
[3745] 오름세 C++ (0) | 2022.03.02 |
---|---|
[17245] 서버실 C++ (0) | 2022.02.21 |
[2805] 나무 자르기 C++ (0) | 2022.02.13 |
[2512] 예산 C++ (0) | 2022.02.09 |
[1920] 수 찾기 C++ (0) | 2022.02.08 |