[백준 C++] 22864. 피로도

garden.97·2021년 11월 29일
0

백준 C++

목록 보기
2/28
post-thumbnail

문제 링크

문제

하루에 한 시간 단위로 일을 하거나 일을 쉬어도 된다. 하루에 한 시간 일하면 피로도는 AA 만큼 쌓이고 일은 BB 만큼 처리할 수 있다.

만약에 한 시간을 쉰다면 피로도는 CC 만큼 줄어든다. 단, 피로도는 절대 0보다 작아질 수 없다. 당연히 일을 하지 않고 쉬었기 때문에 처리한 일은 없다.

피로도를 최대한 MM 을 넘지 않게 일을 하려고 한다. MM 를 넘기면 일하는데 번아웃이 와서 이미 했던 일들도 다 던져버리고 일을 그만두게 된다.

번아웃이 되지 않도록 일을 할때 하루에 최대 얼마나 일을 할 수 있는지 구해보자.


입력

첫 번째 줄에 AA, BB, CC, MM이 공백으로 구분되어 주어진다. (하루는 24시간이다.)

맨 처음 피로도는 0이다.


출력

하루에 번 아웃이 되지 않도록 일을 할 때 최대 얼마나 많은 일을 할 수 있는지 출력한다.


제한

  • 1A1,000,0001 \le A \le 1,000,000
  • 1B10,0001 \le B \le 10,000
  • 1C10,0001 \le C \le 10,000
  • 1M1,000,0001 \le M \le 1,000,000

예제 입력 / 출력

// 예제 입력 1
5 3 2 0
// 예제 출력 1
24
// 예제 입력 2
10 5 1 10
// 예제 출력 2
15
// 예제 입력 3
11 5 1 10
// 예제 출력 3
0

알고리즘
매 시간마다 일을 했을 때의 피로도가 M을 넘지 않는다면 일을 하고, M을 넘는다면 휴식을 취해 피로도를 낮춰주는 과정을 반복해서 총 일을 한 시간을 구하고 시간당 처리량을 곱해 일의 양을 구해준다.


#include <iostream>

using namespace std;

int main(void) {

	int A, B, C, M;
	int num = 0, tired = 0;

	cin >> A >> B >> C >> M;

	for (int i = 0; i < 24; i++) {
		if (tired + A <= M) {
			tired += A;
			num++;
		}
		else {
			tired -= C;
			if (tired < 0) tired = 0;
		}
	}

	cout << num * B;
}

profile
who wants to become a backend developer💪👩‍💻

0개의 댓글