1일1알

백준 17952번 과제는 끝나지 않아! C++ 본문

알고리즘

백준 17952번 과제는 끝나지 않아! C++

영춘권의달인 2023. 1. 30. 15:30

https://www.acmicpc.net/problem/17952

 

17952번: 과제는 끝나지 않아!

성애는 이번 학기에 전공을 정말 많이 듣는다. 이로 인해 거의 매일을 과제를 하면서 보내고 있다. 그런데도 과제가 줄어들 기미가 보이지 않는데, 바로 분단위로 과제가 추가되고 있기 때문이

www.acmicpc.net

 

최근에 했던 과제를 꺼내서 하기에는 스택이 적합한 것 같아서 스택을 사용해서 풀었다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long; 

struct Task {
    int score;
    int time;
};

int n;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    int ans = 0;
    Task* currTask = nullptr;
    stack<Task*> jobStack;
    for (int i = 0; i < n; i++) {
        int val;
        cin >> val;
        if (val == 1) {
            int a, t;
            cin >> a >> t;
            if (currTask == nullptr) {
                currTask = new Task({ a,t });
                if (--currTask->time == 0) {
                    ans += currTask->score;
                    currTask = nullptr;
                }
            }
            else {
                jobStack.push(currTask);
                currTask = new Task({ a,t });
                if (--currTask->time == 0) {
                    ans += currTask->score;
                    currTask = nullptr;
                }
            }
        }
        else {
            if (currTask == nullptr) {
                if (jobStack.empty()) continue;
                currTask = jobStack.top();
                jobStack.pop();
            }
            if (--currTask->time == 0) {
                ans += currTask->score;
                currTask = nullptr;
            }
        }
    }
    cout << ans;
}