알고리즘/백준

백준 1781 컵라면(java)

우리로 2020. 9. 1. 22:57

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

 

1781번: 컵라면

상욱 조교는 동호에게 N개의 문제를 주고서, 각각의 문제를 풀었을 때 컵라면을 몇 개 줄 것인지 제시 하였다. 하지만 동호의 찌를듯한 자신감에 소심한 상욱 조교는 각각의 문제에 대해 데드라�

www.acmicpc.net

처음엔 부분합을 최대로 하는 문제라고 생각했지만 lowebound를 구하는 과정에서 그게 아니라는 걸 알게됐다.

 

데드라인 기준으로 오름차순 정렬을 한다.

차례대로 우선순위 큐에 라면을 넣으면서, 개수가 데드라인을 넘어가면 제일 라면이 적은 것부터 빼낸다.

 

데드라인은 배열의 크기로 볼 수 있다. 만약 어떤 한 과제의 데드라인이 3이라면 배열에서 0~2까지 인덱스에 들어갈 수 있다.

 

꼭 2에 들어갈 필요가 없다는 뜻이다.

 

그렇기 때문에 우선순위 큐를 이용해서, 라면값을 기준으로 정렬할 필요가 있다. 

 

import java.io.*;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Race implements Comparable<Race> {
    int pNum, deadline, ramenNum;

    Race(int a, int b, int c) {
        pNum = a;
        deadline = b;
        ramenNum = c;
    }

    @Override
    public int compareTo(Race o) {
        return Integer.compare(this.deadline, o.deadline);
    }
}

public class boj1781 {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st;
    static int N;
    static Race[] problems;

    public static void main(String[] args) throws Exception{
        input();
        solve();
        bw.flush();
    }

    static int pI(String s) { return Integer.parseInt(s);}

    static void input() throws Exception {
        st = new StringTokenizer(br.readLine());
        N = pI(st.nextToken());
        problems = new Race[N];

        for(int i = 0; i < N; i++){
            st = new StringTokenizer(br.readLine());
            problems[i] = new Race(i+1, pI(st.nextToken()), pI(st.nextToken()));
        }
    }

    static void solve() throws IOException {
        // 데드라인 기준으로 정렬한다.
        Arrays.sort(problems);

        PriorityQueue<Integer> pq = new PriorityQueue<Integer>();

        for(int i = 0; i < N;i++){
        // 현재 데드라인보다 많은 수의 과제를 수행할 수 없다.

            // 작은 것부터 위로오게 한다.
            pq.add(problems[i].ramenNum);
            while(pq.size() > problems[i].deadline)
                pq.poll();
        }

        int ans = 0;
        while(!pq.isEmpty())
            ans += pq.poll();

        bw.write(""+ans);
    }
}