본문 바로가기
백준

백준 1781 컵라면

by 콩순이냉장고 2020. 8. 25.

문제 URL : https://www.acmicpc.net/problem/1781

 

1781번: 컵라면

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

www.acmicpc.net

문제 접근법 : 

PQ를 사용하는게 핵심입니다.

 

첫번째: 그리디 알고리즘문제이기 때문에 정렬은 핵심입니다. 우선은 데드라인이 지나기전에 그안에서 최대로 받을수있는 컵라면수를 받아야하기에 데드라인기준으로 오름차순 컵라면수 기준으로 내림차순으로 정렬했어요

 

둘째 : minheap을 사용해서 첫번째부터 n번째까지 확인하면서 pq에 담습니다. 집어넣습니다. pq에 집어넣을때마다 사이즈가 증가하는데 이사이즈가 곧 데드라인 시간이라고 생각하시면 문제가 곧바로 풀립니다. 즉 사이즈가 증가할때마다

시간이 증가했다는 뜻이되고 사이즈가 데드라인보다 크다면 pq안에있던것은 그문제를 풀수없다는 뜻이 되버리기 때문에 n까지 돌렸으면 남아있는 컵라면수를 다더하면 그문제만 풀게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//By 콩순이냉장고
#include<iostream>
#include<string>
#include<algorithm>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
int n;
typedef pair<intint> p;
vector<p> v;
 
bool cmp(p a, p b){
    if (a.first < b.first)
        return true;
    else if (a.first == b.first&&a.second>b.second)
        return true;
    return false;
}
 
void input()
{
    cin >> n;
    v.resize(n);
    for (int i = 0; i < n; i++)
        cin >> v[i].first >> v[i].second;
}
void solve()
{
    sort(v.begin(), v.end());
    int sum = 0;
    priority_queue<intvector<int>, greater<int>> pq;
    sort(v.begin(), v.end(), cmp);
    for (int i = 0; i < n; i++)
    {
        pq.push(v[i].second);
        if (pq.size() > v[i].first)//size가 곧 시간이고 사이즈가 더크다는것은 데드라인안에 풀수없는 문제
            pq.pop();
    }
 
    while (!pq.empty())
        sum += pq.top(), pq.pop();
    cout << sum << endl;
}
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    input();
    solve();
 
}
 
 
cs

 

 

궁금한점 혹은 모르는점, 혹시 제가 틀린점이 있다면 언제든지 댓글을 이용해주시길 바랍니다.

'백준' 카테고리의 다른 글

백준 5557 1학년  (0) 2020.08.26
백준 10473 인간 대포  (0) 2020.08.25
백준 16985 Maaaaaaaaaze  (0) 2020.08.25
백준 16946 벽 부수고 이동하기 4  (0) 2020.08.24
백준 1202 보석 도둑  (0) 2020.08.24