알고리즘/백준

[C++] 백준 2223 : 금화

0802ojw 2024. 2. 6. 00:13
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int t, x, m;
	int answer = 0;
	cin >> t >> x >> m;

	int d, s;
	int minV = 10000000;
	for (int i = 0; i < m; i++) {
		cin >> d >> s;
		minV = min(minV, (d - 1) / s);
	}

	
	if (t >= minV) {
		answer = x * (minV + (t - minV) / 2);
	} 
	if (t < minV) {
		answer = x * t;
	}
	// 몬스터 때문에 아예 금화 파밍을 못하는 경우
	if (minV == 0){ 
		answer = 0;
	}
	// 몬스터가 0마리인 경우
	if (m == 0) {
		answer = x * t;
	}

	cout << answer;

}



[문제풀이 ]
minV : 몬스터가 지민이와 떨어진거리(d) 를 몬스터의 보폭(s)으로 나눈것중에서 최솟값을 구한것으로, 이 시간동안에는 지민이가 금화를 취할 수 있다 , 단 d가 s로 나누어 떨어지는 경우 (ex. d=9 s=3)는 3이 아닌 2동안만 금화를 취할 수 있는것에 유념해서 d-1를 s로 나누어준다.

minV의 시간동안은 금화를 계속 취할 수 있지만 minV 이후에는 금화를 한번 취했다가 쉬었다가,, 취했다가 쉬었다가의 무한 반복이다 (그래서 t-minV를 2로 나눈다). 그래서 t가 minV보다 큰 경우와 작은 경우를 나누어서 구해줘야 한다.

몬스터가 0마리인 경우는 계속 금화를 편하게 파밍 할 수 있다.

minV가 0이라서 아예 파밍이 불가능한 경우도 고려 해주어야 한다.

몬스터의 좌표를 매번 갱신해주는 방법 으로는 시간초과가 난다.

수학적인 연산도 필요하고, 예외 경우도 신경써줘야했던 실버 3치고는 꽤 어려운 문제였다.