본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ) 1173번 : 운동

반응형

www.acmicpc.net/problem/1173

 

1173번: 운동

첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.

www.acmicpc.net

수학적으로 생각해 푼 문제였습니다.

 

 

풀이방법

 * -1인 경우 : 운동시 바로 맥박이 M을 초과할 경우가 -1인 경우입니다. 아무리 최소 맥박에서 운동을 하더라도 운동 하자마자 제한 맥박을 초과시 운동을 n분할 수 없습니다. 그 외의 경우에는 휴식을 계속 취해서 맥박을 최소로 하거나 다음 운동을 바로 할 수 있을 때까지만 쉬어줌으로써 계속 운동을 할 수 있습니다.

 

 1. 현재 맥박 + T(운동 시 늘어나는 맥박 수) <= M이라면 운동할 수 있으므로 cnt++, 그 후 현재 맥박에 T를 더한 값으로 맥박을 갱신합니다.

 2. 아닌 경우는 휴식이 필요한 경우로 R만큼 현재맥박 수에서 빼줍니다.

 

Code

#include <iostream>
using namespace std;
int N, m, M, T, R;
int cnt, currentPulse, time;
int main(){
    cin >> N >> m >> M >> T >> R;
    currentPulse = m;
    if(currentPulse + T > M){
        cout << -1 << '\n';
        return 0;
    } 
    for(int cnt = 0; cnt < N;){
        time++;
        if(currentPulse + T <= M){
            currentPulse += T;
            cnt++;
        }
        else {
            currentPulse -= R;
            if(currentPulse < m) currentPulse = m;
        }
    }
    cout << time <<'\n';
}

 

Test Case

 반례를 직접 작성해 보았습니다. 

 

input

5 70 120 60 15

-1