작성일 :

문제 링크

1173번 - 운동

설명

운동을 N분 하기 위해 필요한 최소 시간을 구하는 문제입니다. 운동하면 맥박이 증가하고, 휴식하면 감소하며, 맥박이 최대치를 넘으면 운동할 수 없습니다.


접근법

먼저 운동이 가능한지 확인합니다. 초기 맥박에서 운동 시 증가량을 더했을 때 최대 맥박을 초과하면 한 번도 운동할 수 없으므로 불가능합니다.

운동이 가능하다면 시뮬레이션을 진행합니다. 매 분마다 현재 맥박에서 운동이 가능하면 운동하고 맥박을 증가시킵니다. 불가능하면 휴식하고 맥박을 감소시키되, 초기 맥박 아래로는 내려가지 않습니다.

N분의 운동을 모두 완료할 때까지 걸린 총 시간을 출력합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;

class Program {
  static void Main() {
    var parts = Console.ReadLine()!.Split();
    var n = int.Parse(parts[0]);
    var m = int.Parse(parts[1]);
    var M = int.Parse(parts[2]);
    var T = int.Parse(parts[3]);
    var R = int.Parse(parts[4]);

    if (M - m < T) {
      Console.WriteLine(-1);
      return;
    }

    var pulse = m;
    var time = 0;
    while (n > 0) {
      if (pulse + T <= M) {
        pulse += T;
        n--;
      } else {
        pulse -= R;
        if (pulse < m) pulse = m;
      }
      time++;
    }

    Console.WriteLine(time);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, m, M, T, R;
  cin >> n >> m >> M >> T >> R;

  if (M - m < T) {
    cout << -1 << "\n";
    return 0;
  }

  int pulse = m, time = 0;
  while (n > 0) {
    if (pulse + T <= M) {
      pulse += T;
      n--;
    } else {
      pulse -= R;
      if (pulse < m) pulse = m;
    }
    time++;
  }

  cout << time << "\n";

  return 0;
}