알고리즘/백준
[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치고는 꽤 어려운 문제였다.