PS/BOJ
백준 1417번: 국회의원 선거 (C++)
도비(Doby)
2022. 11. 21. 22:16
https://www.acmicpc.net/problem/1417
1417번: 국회의원 선거
첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같
www.acmicpc.net
Level: Silver V
Solved By: Priority Queue, Greedy
아마 우선순위 큐라는 키워드가 없었다면 문제를 푸는데 어려움을 겪었을 것 같습니다.
1번의 value를 따로 받고 최댓값 우선순위 큐를 선언하여 나머지 value들을 넣어줍니다. 그러면 최댓값을 순서로 우선순위 큐에 담겨 있습니다.
1번의 value와 우선순위 큐의 top과 비교를 하며 크거나 같다면 표 하나를 뺏어야 합니다.
즉, 표를 가져왔으니 value에는 1을 더해주고, top에는 1을 빼주어 다시 우선순위 큐에 push 합니다. 이러한 과정을 1번의 value가 우선순위 큐의 top보다 작은 동안 반복하는 코드를 짭니다.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int N;
struct cmp{
bool operator()(int a,int b){
return a < b;
}
};
priority_queue<int, vector<int>, cmp> pq;
int main(){
cin >> N;
int v; cin >> v;
for(int i = 0; i < N - 1; i++){
int a; cin >> a;
pq.push(a);
}
int res = 0;
while(!pq.empty() && v <= pq.top()){
int t = pq.top();
pq.pop();
pq.push(t - 1);
res++;
v++;
}
cout << res;
return 0;
}