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

+ Recent posts