728x90
https://www.acmicpc.net/problem/1173
1173번: 운동
첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.
www.acmicpc.net
이 문제는 주어진 조건들을 제대로 보고 while문 내에서 조건에 맞춰 구현하면 쉽게 풀린다. 대신, 운동시간을 n 등분할 수 없는 경우가 있으므로 신경을 써줘야 하는데, 처음엔 이 부분이 이해가 가지 않았다. 하지만 주어진 예제에서 이 경우에 대한 예제가 있어서 어떤 문제인지 확인하고 이에 대한 조건을 달 수 있었는데, 운동시간이 n등분이 되지 않는 경우를 보니까
초기 맥박(x) + t 가 M보다 크고, x - r이 m보다 작은 경우가 발생하면 무한 루프가 발생한다. 운동을 계속할 수 없는 상황이 발생한다..!!
이 경우는 while문을 돌리지 않고 그 전에 끝내주면 된다.
1. 운동: x + t <= M인 경우
x += t (현재 맥박 바꾸기)
et++ (운동 시간 추가)
2. 휴식: x + t > M인 경우
x = x - r < m ? m : x - r
전체 시간(time++) 증가
#include <iostream>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, m, M, t, r;
cin >> n >> m >> M >> t >> r;
int x = m, et = 0, time = 0;
if(x+t>M && x-r<m){ //n등분할 수 없는 경우
cout << "-1\n";
}else{
while(et != n){ //운동시간 N분이 되면 끝내고 시간 출력
if(x+t <= M){ //운동 가능
x = x+t;
et++;
}else{ //운동 불가 -> 휴식하기
x = x-r < m ? m : x-r;
}
time++;
}
cout << time << '\n';
}
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 10709번: 기상캐스터 (0) | 2022.04.22 |
---|---|
[백준/c++] 9517번: 아이 러브 크로아티아 (0) | 2022.04.22 |
[백준/c++] 3028번: 창영마을 (0) | 2022.04.22 |
[백준/c++] 14470번: 전자레인지 (0) | 2022.04.22 |
[백준/c++] 10804번: 카드 역배치 (0) | 2022.04.22 |