UVa10954

題目:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=21&page=show_problem&problem=1895

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <queue>

using namespace std;
using ll = long long;

int main(){
int n, m;

while(cin >> n){
if(n == 0) break;
priority_queue<ll, vector<ll>, greater<ll>> pq;
ll tmp, sum, a, b;

sum = 0;

for(int i=0; i<n; ++i){
cin >> m;
pq.push(m);
// 把數值傳到pq 自動做排序
}

while(pq.size() > 1){
a = pq.top();
pq.pop();
b = pq.top();
pq.pop();
// 每次取最頂端兩個(greater,最上面最小值)

tmp = a + b;
sum += tmp;
pq.push(tmp);
// 做完相加加回去pq 再做一次排序
}

cout << sum << '\n';
}
}