https://www.acmicpc.net/problem/14698
14698번: 전생했더니 슬라임 연구자였던 건에 대하여 (Hard)
각 테스트 케이스마다 슬라임을 끝까지 합성했을 때 청구될 비용의 최솟값을 1, 000, 000, 007로 나눈 나머지를 출력한다. 전기 에너지가 전혀 필요하지 않은 경우엔 1 을 출력한다.
www.acmicpc.net
우선순위 큐를 활용한 그리디 문제
언뜻 보면 파일 합치기(11066번)과 비슷해 보일 수 있지만 이 문제의 경우에는 연속해있는 파일만 합칠 수 있다던지 하는 조건이 없으므로 현재 상황에서 가장 에너지가 작은 슬라임 두 개를 합치면 된다.
매번 가장 에너지가 작은 슬라임 두 개를 찾기 위해서 우선 순위 큐를 사용할 것이고 가중치가 가장 적은 것을 선택해야 되므로 마이너스로 우선 순위 큐에 푸쉬해줄 것이다.
AC code
#include <bits/stdc++.h>
#define MOD 1000000007
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin>>T;
while(T--) {
ll N,t,sol=1;
priority_queue<ll> pq;
cin>>N;
for(int i=0;i<N;i++) {
cin>>t;
pq.push(-t);
}
while(1) {
t=pq.top();
pq.pop();
if(pq.empty()) break;
t=t*pq.top();
pq.pop();
sol=sol*(t%MOD)%MOD;
pq.push(-t);
}
cout<<sol<<"\n";
}
}
주의해야 될 점은 MOD연산을 하는 부분이다.
우선 순위 큐에 넣을 때는 모드 연산을 하면 안 되고 답을 구하는 것에서만 모드 연산을 해야되며 전체 곱은 물론, 곱해주기 전에도 모드 연산을 한 값을 곱해줘야 된다.
'프로그래밍 > 알고리즘 문제 풀이' 카테고리의 다른 글
BOJ(백준) 20191번 줄임말 (0) | 2024.02.19 |
---|---|
BOJ(백준) 14401번 악덕 나라 (0) | 2024.02.17 |
BOJ(백준) 30400번 팰린드롬 제거 (3) | 2024.02.16 |
BOJ(백준) 5502번 팰린드롬 (2) | 2024.02.14 |
BOJ(백준) 30831번 선후수과목 (0) | 2024.02.12 |