

https://www.acmicpc.net/problem/27896
[ 문제 요약 ]
파마산을 묻혀 튀긴 소고기를 받을 경우 학생들의 불만도가 올라가고 가지를 받을 경우 불만도가 낮아질 때 학생들의 불만도가 M이상이 되지 않도록 하기 위한 가지의 최소 개수를 출력한다.
[ 문제 풀이 ]
1. 학생들의 불만도를 입력받아 더했을 때 총합이 M보다 낮으면 그냥 더한 후 우선순위 큐에 넣는다.
2. 만약 M을 넘을 경우 우선순위 큐에서 가장 큰 값인 top 값을 총합이 M보다 작아 질 때까지 2를 곱해서 뺀다.
3. 빼는 횟수만큼 가지의 개수를 늘린다.
[ 소스 코드 ]
#include <bits/stdc++.h>
using namespace std;
long long M, sum = 0, cont = 0;
int N;
priority_queue<long long> pq;
int main() {
cin >> N >> M;
for (int i=0; i<N; i++){
long long a;
cin >> a; pq.push(a);
sum += a;
while (sum >= M){
cont++;
sum -= pq.top() * 2;
pq.pop();
}
}
cout << cont;
return 0;
}
[ 주의할 점 ]
학생들이 순서대로 줄을 서고 있는 것이기 때문에 정렬을 해서 풀는 것은 안된다.
'백준' 카테고리의 다른 글
| [ 백준 2872 ] 우리집엔 도서관이 있어 (c/c++) (0) | 2024.11.08 |
|---|---|
| [ 백준 1689 ] 겹치는 선분 (c/c++) (0) | 2024.11.07 |
| [ 백준 11000 ] 강의실 배정 (c/c++) (0) | 2024.11.05 |
| [ 백준 1421 ] 나무꾼 이다솜 (c/c++) (1) | 2024.10.08 |
| [ 백준 1850 ] 최대공약수 (c/c++) (0) | 2024.10.07 |