https://www.acmicpc.net/problem/17952
코드
#include <iostream>
#include <stack>
using namespace std;
#define FASTIO ios::sync_with_stdio(false);cin.tie(NULL);
typedef long long ll;
stack<pair<int, int>> st;
int main() {
FASTIO;
int n, a, t, order;
ll ans = 0;
cin >> n;
while (n--) {
cin >> order;
if (order == 1) {
cin >> a >> t;
if (t == 1) ans += a;
else st.push({ a, t-1 });
}
else {
if (!st.empty()) {
st.top().second--;
if (st.top().second == 0) {
ans += st.top().first;
st.pop();
}
}
}
}
cout << ans;
return 0;
}
설명
과제의 만점과 해결하는 데 걸리는 시간을 pair<int, int>로 해서 과제 정보를 스택에 넣어줍니다. 과제가 주어지는 경우에는 그 즉시 1분을 소모해 과제를 진행하므로 t - 1을 넣어줘야 합니다. (t가 1이면 받은 즉시 완료하는 과제이므로 스택에 넣을 필요 없이 과제 만점 점수만 최종 점수에 더해줍니다.) 과제가 주어지지 않는 경우에는 st.top().second를 1 감소시켜 과제를 진행했음을 표시합니다. 이때 0이 되면 해당 과제를 끝낸 것이니 과제의 만점 점수를 더해줍니다. st.top()을 호출하기 전 st이 empty 상태인지 먼저 확인해주어야 합니다.
느낀 점
새로운 과제가 나오면 새 과제부터 한다는 점에서 스택을 이용해 풀어야겠다고 생각했습니다. 바로 구현했고 한 번에 맞았습니다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C++] 18126 너구리 구구 (0) | 2024.09.14 |
---|---|
[백준/C++] 1240 노드사이의 거리 (2) | 2024.09.14 |
[백준/C++] 14267 회사 문화 1 (1) | 2024.09.10 |
[백준/C++] 12852 1로 만들기 2 (0) | 2024.09.05 |
[백준/C++] 18405 경쟁적 전염 (0) | 2024.09.04 |