본문 바로가기
알고리즘/백준

백준 27896 특별한 서빙 C++

by ash9river 2024. 11. 8.

간단한 해설

처음에는 투포인터를 사용해서 문제를 풀려고했었다. 그러나

 

음식을 앞에 서있는 학생부터 순서대로 서빙할 때, 어떤 한 순간이라도 불만도가 M 이상이 되면 학생들은 ‘가지 운동’을 일으키게 된다.

 

이 지문때문에, 우선순위 큐로 관리해서 푸는 것이 해법임을 깨달았다.

 

처음부터 일단 음식을 파로 받는다. 그러다가 불만도가 M 이상이 되면, 제일 큰 값을 가지로 바꾸면 된다. (이때, 더해준 값을 빼준 값으로 바꿔야하므로 -2*x_i로 한다.)

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
using namespace std;
int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	ll n,m;
	cin>>n>>m;
	vector<ll> v(n);
	for(int i=0;i<n;++i){
		cin>>v[i];
	} 
	priority_queue<ll> q;
	ll sum=0,ans=0;
	for(int i=0;i<n;++i){
		sum+=v[i];
		q.push(v[i]);
		while(sum>=m){
			ll val=q.top();
			sum-=2*val;
			q.pop();
			++ans;
		}
	}
	cout<<ans;
}

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 23883 알고리즘 수업 - 선택 정렬 3 C++  (0) 2024.10.22
백준 16469 소년 점프 C++  (0) 2024.10.21
백준 16562 친구비 C++  (1) 2024.10.15
백준 27978 보물 찾기 2 C++  (0) 2024.10.10
백준 10830 행렬 제곱 C++  (1) 2024.10.06