[Usaco2006 Nov] Fence Repair 切割木板

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1356  Solved: 714
[Submit][Status][Discuss]
php

Description

Farmer John想修理牧場柵欄的某些小段。爲此,他須要N(1<=N<=20,000)塊特定長度的木板,第i塊木板的長度爲Li(1<=Li<=50,000)。而後,FJ去買了一塊很長的木板,它的長度正好等於全部須要的木板的長度和。接下來的工做,固然是把它鋸成須要的長度。FJ忽略全部切割時的損失——你也應當忽略它。 FJ鬱悶地發現,他並無鋸子來把這塊長木板鋸開。因而他把這塊長木板帶到了Farmer Don的農場,想向FD借用鋸子。 做爲一個有商業頭腦的資本家,Farmer Don沒有把鋸子借給FJ,而是決定幫FJ鋸好全部木板,固然FJ得爲此付出一筆錢。鋸開一塊木板的費用,正比於木板的長度。若是這塊木板的長度是21,那麼鋸開它的花費即是21美分。 談妥條件後,FD讓FJ決定切割木板的順序,以及每次切割的位置。請你幫FJ寫一個程序,計算爲了鋸出他想要的木板,他最少要花多少錢。很顯然,按不一樣的切割順序來切開木板,FJ的總花費可能不一樣,由於不一樣的切割順序,會產生不一樣的中間結果。 spa

Input

* 第1行: 一個正整數N,表示FJ須要木板的總數 code

* 第2..N+1行: 每行包含一個整數,爲FJ須要的某塊木板的長度blog

Output

* 第1行: 輸出一個整數,即FJ完成對木板的N-1次切割的最小花費 ip

Sample Input

3
8
5
8


FJ打算把一塊長爲21的木板切成長度分別爲8,5,8的三段。

Sample Output

34
輸出說明:

起初,木板的長度爲21。第一次切割木板花費21美分,把木板切成長分別爲13和8的兩塊。而後花費1
3美分把長爲13的木板切成長爲8和5的兩塊。這樣的總花費是21+13=34美分。若是第一次把木板切成長
爲16和5的兩塊,那麼第二次切木板的花費就是16美分,這樣的總花費就是37美分,比剛纔花費34美分的方案來的差。

思路

稍微逆向思惟一下,這就是個合併果子QUQ

代碼實現

 1 #include<queue>
 2 #include<cstdio>
 3 const int maxn=2e4+10;
 4 int n,x,y;
 5 long long ans;
 6 std::priority_queue<int>q;
 7 int main(){
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++){
10         scanf("%d",&x);
11         q.push(-x);
12     }
13     for(int i=1;i<n;i++){
14         x=q.top(),q.pop(),ans-=x;
15         y=q.top(),q.pop(),ans-=y;
16         q.push(x+y);
17     }
18     printf("%lld\n",ans);
19     return 0;
20 }
相關文章
相關標籤/搜索