1724: [Usaco2006 Nov]Fence Repair 切割木板( 贪心 )
倒過來看 , 每次總是選擇最短的兩塊木板合并 , 用heap維護
------------------------------------------------------------------------------
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#define rep( i , n ) for( int i = 0 ; ?i < n ; ++i )#define clr( x , c ) memset( x , c , sizeof( x ) )using namespace std;const int maxn = 20000 + 5;priority_queue< int , vector< int > , greater< int > > Q;int main() {freopen( "test.in" , "r" , stdin );int n;cin >> n;rep( i , n ) {int t;scanf( "%d" , &t );Q.push( t );}long long ans = 0;for( ; ; ) {int x , y;if( Q.empty() )? ? ?break;else? ? ?x = Q.top() , Q.pop();if( Q.empty() )? ? ?break;else? ? ?y = Q.top() , Q.pop();Q.push( x + y );ans += x + y;?}cout << ans << "\n";return 0;}?
------------------------------------------------------------------------------
1724: [Usaco2006 Nov]Fence Repair 切割木板
Time Limit:?5 Sec??Memory Limit:?64 MBSubmit:?875??Solved:?436
[Submit][Status][Discuss]
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的總花費可能不同,因為不同的切割順序,會產生不同的中間結果。
Input
* 第1行: 一個正整數N,表示FJ需要木板的總數
* 第2..N+1行: 每行包含一個整數,為FJ需要的某塊木板的長度
Output
* 第1行: 輸出一個整數,即FJ完成對木板的N-1次切割的最小花費
Sample Input
38
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美分的方案來的差。
HINT
Source
Gold
?
轉載于:https://www.cnblogs.com/JSZX11556/p/4556846.html
總結
以上是生活随笔為你收集整理的1724: [Usaco2006 Nov]Fence Repair 切割木板( 贪心 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi VCL研究之消息分发机制(
- 下一篇: 【Treap】[BZOJ 3224]Ty