mojo's Blog

#Educational Codeforces Round 72 B - Zmei Gorynich 본문

코드포스

#Educational Codeforces Round 72 B - Zmei Gorynich

_mojo_ 2021. 9. 11. 14:04

문제 링크 => Dashboard - Educational Codeforces Round 72 (Rated for Div. 2) - Codeforces

 

Dashboard - Educational Codeforces Round 72 (Rated for Div. 2) - Codeforces

 

codeforces.com


어제 밤에 ICPC 학회분들과 virtual 을 돌려서 푼 문제인데 뇌절을 계속해서 풀지 못한 문제이다.

 

 

이러한 용의 머리의 길이 x 가 주어질 때 n 개의 Query가 주어진다.

 

Query 는 머리의 길이를 d 만큼 잘라낼 수 있는 d 값과 자른 후에 h 만큼 다시 생겨나는 h 값이 주어진다.

 

이 때 용의 머리를 완전하게 잘라낼 수 있는 경우 최소로 자른 횟수를 출력하고 그렇지 못한 경우 -1을 출력하는 문제이다.

 

일단 단순하게 생각하면 잘라낼 수 있는 d 값에 대하여 d >= x 일 경우 용의 머리는 단 한번에 잘라낼 수 있다는 것은 확실하다.

 

그렇다면 d < x 인 경우인데 용의 머리를 최소로 자르기 위해서 자를 수 있는 방법은 다음과 같다.

 

n 개의 Query 에서 d 값의 최대와 (d - h) 값의 최대를 저장한다.

 

편의상 maxD = max( d1, d2, ... , dn ), maxDiff = max( d1 - h1, d2 - h2, ... , dn - hn ) 라고 할 때, 

 

(1) maxD >= x 인 경우 ) 1을 출력

 

(2) maxDiff == 0 인 경우 ) 잘랐다가 늘어났다가 무한히 반복하는 경우이다. 즉, -1 출력

 

(3) 그 외의 경우 ) 한번에 잘라지지도 않고 무한히 반복하는 경우도 아닌 자를 수 있는 횟수가 정해져 있는 경우이다.  즉, (x - maxD) / maxDiff + 1 + ((x - maxD) % maxDiff == 0 ? 0 : 1) 값을 출력하며 답이다.

식이 좀 복잡한데 직접 해보니깐 이런 규칙성이 보였다.

 

뇌절하기 굉장히 좋은 문제인거 같다.

 

첨에 d, d-h 가 pair 한 상태로 계속 찾다보니 틀렸는데 다른 분들 풀이를 보니깐 한번에 d, d-h의 max값을 구해서 바로 구하는 풀이였다.

 

아무래도 코드포스는 너무나도 어렵다.

 

풀이 Code

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#define endl '\n'
#define INF 1000000000
#define ll long long

using namespace std;

void test() {

	ll n, x, maxD, maxDiff;
	maxD = maxDiff = -1e18;
	cin >> n >> x;

	for (int i = 0; i < n; i++) {
		ll d, h;
		cin >> d >> h;
		maxD = max(maxD, d);
		maxDiff = max(maxDiff, d - h);
	}

	if (maxD >= x) cout << 1 << endl;
	else if (maxDiff <= 0) cout << -1 << endl;
	else cout << (x - maxD) / maxDiff + 1 + 
		((x - maxD) % maxDiff == 0 ? 0 : 1) << endl;

}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	int t;
	cin >> t;
	while (t--) {
		test();
	}

	return 0;
}

 

'코드포스' 카테고리의 다른 글

#589 (Div.2) B - Filling the Grid  (0) 2021.09.25
#Educational Codeforces Round 114 (Div.2) C - Slay the dragon  (0) 2021.09.21
#742 (Div.2) B - MEX or Mixup  (0) 2021.09.06
#740 (Div.2) C - Deep Down Below  (0) 2021.08.30
#741 (Div.2) C - Rings  (0) 2021.08.29
Comments