PTA 7-8(樹) 修理牧場(25 分) 最優二叉樹
阿新 • • 發佈:2019-01-03
最優二叉樹問題
把最小的兩端拿出來連線後放入佇列中,重複的上述操作,,
用優先佇列可以容易完成
(注:部落格作為交流使用,切勿抄襲應付作業)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cmath> #include <set> #include <map> #include <stack> #include <queue> #include <ctype.h> #include <vector> #include <algorithm> #include <sstream> #define PI acos(-1.0) #define in freopen("in.txt", "r", stdin) #define out freopen("out.txt", "w", stdout) using namespace std; typedef long long ll; const int maxn = 1000 + 7, INF = 0x3f3f3f3f, mod = 1e9 + 7; int n; priority_queue<int, vector<int>, greater<int> > qu; void init() { scanf("%d", &n); int x; for(int i = 0; i < n; ++i) { scanf("%d", &x); qu.push(x); } } void solve() { int ans = 0; while(!qu.empty()) { int t1 = qu.top(); qu.pop(); if(qu.empty()) { break; } int t2 = qu.top(); qu.pop(); t1 += t2; ans += t1; if(qu.empty()) break; qu.push(t1); } cout << ans << endl; } int main() { init(); solve(); return 0; } /* 8 4 5 1 2 1 3 1 1 */