https://www.acmicpc.net/problem/1173
사고과정)
결국 고려해야할 지점은 두 가지다
1) 운동을 할 시, 최대값(경계값)을 초과할 수 없다. 초과하면 무조건 휴식을 해서 감소시켜야한다.
2) 휴식을 통한 감소값이 너무 크면, 최소값(경계값) 아래로 내려갈 수 없게 설정해줘야한다.
즉, 심박수는 최소값 아래로 내려갈 수 없게 설정해줘야한다.
#include <iostream>
using namespace std;
int main()
{
int N, m, M, T, R;
cin >> N >> m >> M >> T >> R;
int exercise = 0;
int rest = 0;
int sum = m;
if (m + T > M)
{
cout << -1;
return 0;
}
while (exercise < N)
{
while (sum + T > M)
{
sum = sum - R;
rest++;
if (sum <= m)
sum = m;
}
sum = sum + T;
exercise++;
}
int result = exercise + rest;
cout << result;
return 0;
}
우선 운동을 한 번 했는데 최대 심박수를 초과하는 경우는 운동을 하는 것 자체가 불가하다.
그렇기에 이럴 땐 조건문으로 예외처리를 해주었다.
그리고 사고과정 1)에서 말했던 것처럼, 최대값(M)을 초과하는 경우, 휴식을 시키면서 감소시켰고
예외사항으로 사고과정2)를 넣어주었다.
정답률이 왜 낮을까 고민을 조금 해봤는데
아마 대다수는 초반에 그냥 운동횟수만큼 다 증가시킨다음에, 최댓값 경계 아래로 올때까지 휴식을 계속 시키면 되지 않을까? 싶은 생각이 들지 않았을까 싶다.
나 역시 초반에 코드를 그렇게 작성하고 제출 전에 테스트를 했으나, 휴식할 때 줄어드는 값이 운동으로 커지는 값보다지나치게 크면, 최소값 경계를 뚫고 내려가버리기 때문에 불가하다.
'백준 문제풀이 > 브론즈2' 카테고리의 다른 글
백준 2292번 - 벌집 (0) | 2021.11.30 |
---|---|
백준 10809번 - 알파벳 찾기 (0) | 2021.11.25 |
백준 1264번 - 모음의 개수 (0) | 2021.10.26 |
백준 1152번 - 단어의 갯수 (0) | 2021.10.20 |
백준 1159번 - 농구 경기 (0) | 2021.10.20 |