1. 程式人生 > >洛谷 P1334 瑞瑞的木板

洛谷 P1334 瑞瑞的木板

def out clu 測量 reg lan spa 每次 string

P1334 瑞瑞的木板

題目描述

瑞瑞想要親自修復在他的一個小牧場周圍的圍欄。他測量柵欄並發現他需要N(1≤N≤20,000)根木板,每根的長度為整數Li(1≤Li≤50,000)。於是,他神奇地買了一根足夠長的木板,長度為所需的N根木板的長度的總和,他決定將這根木板切成所需的N根木板。(瑞瑞在切割木板時不會產生木屑,不需考慮切割時損耗的長度)瑞瑞切割木板時使用的是一種特殊的方式,這種方式在將一根長度為x的模板切為兩根時,需要消耗x個單位的能量。瑞瑞擁有無盡的能量,但現在提倡節約能量,所以作為榜樣,他決定盡可能節約能量。顯然,總共需要切割N-1次,問題是,每次應該怎麽切呢?請編程計算最少需要消耗的能量總和。

輸入輸出格式

輸入格式:

第一行: 整數N,表示所需木板的數量

第2到N+1行: 每行為一個整數,表示一塊木板的長度

輸出格式:

一個整數,表示最少需要消耗的能量總和

輸入輸出樣例

輸入樣例#1: 復制
3
8
5
8
輸出樣例#1: 復制
34

說明

將長度為21的木板,第一次切割為長度為8和長度為13的,消耗21個單位的能量,第二次將長度為13的木板切割為長度為5和8的,消耗13個單位的能量,共消耗34個單位的能量,是消耗能量最小的方案。

思路:優先隊列的貪心。

#include<queue>
#include
<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long using namespace std; int n; LL t,ans=0; priority_queue<LL, vector<LL>, greater<LL> > q; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf(
"%lld",&t); q.push(t); } for(int i=1;i<n;i++){ int x=q.top();q.pop(); int y=q.top();q.pop(); x+=y;ans+=x; q.push(x); } cout<<ans<<endl; return 0; }

洛谷 P1334 瑞瑞的木板