넘치게 채우기

[BOJ] 13904 - 과제 본문

PS/BOJ

[BOJ] 13904 - 과제

riveroverflow 2025. 8. 10. 14:12
728x90
반응형

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

BOJ - 과제

문제 유형: 그리디, 우선순위 큐, 정렬

문제 난이도: Gold III

시간 제한: 1초

메모리 제한: 256MB

 

문제

웅찬이는 과제가 많다. 하루에 한 과제를 끝낼 수 있는데, 과제마다 마감일이 있으므로 모든 과제를 끝내지 못할 수도 있다. 과제마다 끝냈을 때 얻을 수 있는 점수가 있는데, 마감일이 지난 과제는 점수를 받을 수 없다.

웅찬이는 가장 점수를 많이 받을 수 있도록 과제를 수행하고 싶다. 웅찬이를 도와 얻을 수 있는 점수의 최댓값을 구하시오.

 

입력

첫 줄에 정수 N (1 ≤ N ≤ 1,000)이 주어진다.

다음 줄부터 N개의 줄에는 각각 두 정수 d (1 ≤ d ≤ 1,000)와 w (1 ≤ w ≤ 100)가 주어진다. d는 과제 마감일까지 남은 일수를 의미하며, w는 과제의 점수를 의미한다.

 

출력

얻을 수 있는 점수의 최댓값을 출력한다.

 

풀이

우선순위 큐에 {마감기한, 점수}를 넣고, 점수에 대해, 그리고 같은 점수에 대해서는 마감기한에 대해 최대 힙으로 만들어 저장한다.

 

가장 늦은 시간부터 해서, 역순으로 현재 수행해서 최고의 점수를 얻을 수 있는 과제를 해야 한다.

time = maxTime부터 해서, 현재 time에서 가능한 가장 큰 점수의 과제를 골라서 수행한다.

 

이렇게 쌓인 누적 점수가 최선이다.

 

 

코드

C++

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using pii = pair<int, int>;

struct comp {
    bool operator()(const pii &a, const pii &b) {
        if (a.second == b.second) {
            return a.first < b.first;
        }
        return a.second < b.second;
    }
};

int main(int argc, char *argv[]) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin >> n;

    int maxTime = -1;
    priority_queue<pii, vector<pii>, comp> pq;
    for (int i = 0; i < n; i++) {
        int d, w;
        cin >> d >> w;
        pq.emplace(d, w);
        maxTime = max(d, maxTime);
    }

    int ans = 0;
    for (int time = maxTime; time >= 1; time--) {
        int deadline = -1, weight = -1;
        stack<pii> stk;
        while (!pq.empty()) {
            int d, w;
            d = pq.top().first;
            w = pq.top().second;
            pq.pop();

            if (d >= time) {
                deadline = d;
                weight = w;
                break;
            }

            stk.emplace(d, w);
        }

        while (!stk.empty()) {
            pq.emplace(stk.top().first, stk.top().second);
            stk.pop();
        }

        if (weight != -1) ans += weight;
    }

    cout << ans << "\n";

    return 0;
}
728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 2982 - 국왕의 방문  (0) 2025.08.17
[BOJ] 30686 - 과제 제출하기  (0) 2025.08.16
[BOJ] 33496 - 미술 수업  (0) 2025.08.09
[BOJ] 15979 - 스승님  (0) 2025.08.06
[BOJ] 12911: 좋아하는 배열  (0) 2025.08.03