[Google Kick Start - Round A 2020] Workout

Mar 24, 2020


[Google Kick Start - Round A 2020] Workout

문제 요약

각각 운동 진행 시간을 갖는 N개의 운동 세션과 양의 정수 K가 주어지고, 운동의 어려움 값은 연속된 운동 세션 간의 진행 시간 차이 중 가장 큰 차이이다.
이 때, K만큼 운동 세션을 추가해서 이 운동의 어려움을 최소로 하고 어려움의 최솟값을 구하는 문제

풀이

내가 문제를 해결한 방법은 운동의 어려움 값을 이분탐색으로 늘렸다 줄였다 하면서 해당 어려움 값을 유지하면서 K개의 운동 세션을 추가할 수 있는지 확인하는 작업을 통해 문제를 해결했다.

코드

#include <iostream>
#include <algorithm>
using namespace std;
int T, N, K, arr[100000];
bool go(long long g) {
	int k = K, pre = arr[0];
	for (int i = 1; i < N; i++) {
		int gap = arr[i] - pre - 1;
		if (gap > 0) k -= gap / g;
		pre = arr[i];
		if (k < 0) return 1;
	}
	return 0;
}
int main() {
	scanf("%d", &T);
	for (int tc = 1; tc <= T; tc++) {
		long long l = 1, r = 0;
		scanf("%d %d", &N, &K);
		for (int i = 0; i < N; i++) {
			scanf("%d", &arr[i]);
			if (i > 0) r = max(r, (long long)arr[i] - arr[i - 1]);
		}
		while (l <= r) {
			long long m = (l + r) / 2;
			go(m) ? l = m + 1 : r = m - 1;
		}
		printf("Case #%d: %lld\n", tc, l);
	}
	return 0;
}