[BOJ 17503] 맥주 축제
[BOJ 17503] 맥주 축제
문제 출처 : https://www.acmicpc.net/problem/17503
풀이
문제를 보았을 때
- K의 범위가 2^31-1 까지이므로 Parametric Search로 답을 특정하는 방법
 - 우선순위 큐를 이용해서(또는 min-heap) 푸는 방법
 
2번을 생각해내는게 조금 핵심적인 문제라 생각하는데, N개의 맥주를 무조건 먹어야 하고, M보다 같거나 많이 먹어야 하기 때문에 현재까지 어떤 것을 선택해서 먹고 있는지를 기억해야하기 때문이다.
코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX = 2e5;
struct Beer{
    int v, c;
    bool operator<(const Beer &x)const{
        return{ c<x.c || (c==x.c && v<x.v)};
    }
};
priority_queue<int, vector<int>, greater<int> > pq;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int N, M, K;
    vector<Beer> beer;
    int sum[MAX]={0,};
    cin >> N >> M >> K;
    for(int i=0; i<K; i++){
        Beer k;
        cin >> k.v >> k.c;
        beer.push_back(k);
    }
    sort(beer.begin(),beer.end());
    sum[0]=beer[0].v;
    pq.push(beer[0].v);
    int ans=-1;
    for(int i=1; i<K; i++){
        int k = 0;
        pq.push(beer[i].v);
        if(i>=N){
            k = pq.top();
            pq.pop();
        }
        sum[i]=sum[i-1]-k+beer[i].v;
        if(sum[i]>=M && i>=N-1){
            ans=beer[i].c;
            break;
        }
    }
    cout << ans;
    return 0;
}
조심해야할 부분
- 우선순위 큐에서 빼고 현재 value를 넣을 때, 현재 value가 큐에서 나온 값보다 작을 경우
 - N개의 맥주를 먹기 전에 M이상의 선호도를 채울 경우
 
코드 개선점
- sum이 배열일 필요는 없다.
 
Leave a comment