문제 링크 : https://www.acmicpc.net/problem/1715
최소 우선순위 큐를 사용해서 앞의것 부터 2개씩 뽑아 더하면 되는 문제였습니다.
소스코드 :
#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <queue>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
//priority_queue<int> maxHeap;
priority_queue<long long, vector<long long>, greater<long long> > minHeap;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
long long num;
cin >> num;
minHeap.push(num);
}
long long sum = 0;
//sum += minHeap.top();
//minHeap.pop();
while (!minHeap.empty()) {
long long tmp = 0;
if (minHeap.size() > 0) {
tmp += minHeap.top();
minHeap.pop();
}
if (minHeap.size() > 0) {
tmp += minHeap.top();
minHeap.pop();
minHeap.push(tmp);
}
sum += tmp;
if (minHeap.size() == 1) {
break;
}
}
if (n == 1) {
std::cout << 0 << endl;
}
else
std::cout << sum << '\n';
}
최소 우선순위 큐를 사용해서 앞의것 부터 2개씩 뽑아 더하면 되는 문제였습니다.
소스코드 :
#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <queue>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
//priority_queue<int> maxHeap;
priority_queue<long long, vector<long long>, greater<long long> > minHeap;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
long long num;
cin >> num;
minHeap.push(num);
}
long long sum = 0;
//sum += minHeap.top();
//minHeap.pop();
while (!minHeap.empty()) {
long long tmp = 0;
if (minHeap.size() > 0) {
tmp += minHeap.top();
minHeap.pop();
}
if (minHeap.size() > 0) {
tmp += minHeap.top();
minHeap.pop();
minHeap.push(tmp);
}
sum += tmp;
if (minHeap.size() == 1) {
break;
}
}
if (n == 1) {
std::cout << 0 << endl;
}
else
std::cout << sum << '\n';
}
댓글
댓글 쓰기