POJ3253-huffman的wpl

來源:https://vjudge.net/problem/POJ-3253

題目描述(https://vjudge.net/problem/POJ-3253) 農夫約翰想修修牧場周圍的一小部分籬笆。他測量圍欄發現他需要N塊(1≤ N ≤20000)木板,每一個都具有整數長度Li(1≤ Li≤50000)。然後,他購買了一塊足夠長的單板長板,以便得到N塊木板(即長度爲長度L i的總和)。約翰忽略了“切口”,當切割鋸切時,木屑損失了額外的長度,你也應該忽略它。 約翰遺憾地意識到他沒有切割木頭的鋸子,所以他去農夫唐的農場,禮貌地問他是否可以借鋸。唐並沒有借給約翰鋸,而是向約翰提供了切割N -1塊每塊的切割費用。切割一塊木頭的費用與其長度完全相同。切割長度爲21的木板需要21美分。 唐讓約翰決定切割木板的順序和位置。幫助約翰確定他得到N個木板的最低金額。約翰知道他可以以各種不同的順序切割板,這將導致不同的費用,因爲所得到的中間板具有不同的長度。

輸入 第1行:
一個整數N,木板的數量 第2行.
N +1:每行包含一個描述所需木板長度的整數

輸出 第1行:一個整數:他必須花費N -1削減的最低金額 樣例輸入  3  8   5  8

樣例輸出: 34

#include <bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >Q;
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int m;
		cin>>m;
		Q.push(m); 
	}
	
	if(n==1){
		cout<<Q.top();
		return 0;
	}
	
	int total=0;
	while(true){
		int sum=0;
		sum=sum+Q.top();
		Q.pop();
		sum=sum+Q.top();
		Q.pop();
		total=total+sum;
		Q.push(sum);
		if(Q.size()==1){
			break;
		}
	}
	
	cout<<total<<endl;
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章