1. 程式人生 > >[BZOJ 1724] Fence Repair

[BZOJ 1724] Fence Repair

一道 += har pair prior com == span inline

這大概是BZOJ裏除了A+B Problem最水的一道題了吧

題面:http://www.lydsy.com/JudgeOnline/problem.php?id=1724

這道題其實有一些思路還是可以借鑒的

首先是逆向思維:為了讓計算次數最多的邊必須是最小的邊,因此最小的和倒數第二小的必然在二叉樹的最低端

接下來是遞歸(遞推)的思想,將二者合並後,此問題又變為和合並前完全相同的問題,遞推解決即可

維護自然就用priority_queue

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int
n; priority_queue<int,vector<int>,greater<int> > q; inline int read() { char ch; int num,f=0; while(!isdigit(ch=getchar())) f|=(num==-); num=ch-0; while(isdigit(ch=getchar())) num=num*10+ch-0; return f?-num:num; } int main() { n=read(); for(int i=1
;i<=n;i++) { int x=read(); q.push(x); } if(n==1){cout << q.top();return 0;} ll res=0; while(q.size()>1) { int x=q.top();q.pop(); int y=q.top();q.pop(); res+=(x+y); q.push(x+y); } cout << res;
return 0; }

[BZOJ 1724] Fence Repair