[洛谷]P 1334瑞瑞の板(#堆-1.1)


タイトルの説明
瑞瑞瑞は自分で彼の小さな牧場の周りのフェンスを修復しようとした.彼はフェンスを測定し,N(1≦N≦20000)本の板を必要とし,各本の長さは整数Li(1≦Li≦50000)であることを見出した.そこで、彼は不思議にも十分な長さの板を買って、長さは必要なN本の板の長さの総和で、彼はこの板を必要なN本の板に切ることにした.(瑞瑞は板を切断する際に木屑が発生せず、切断時の損失の長さを考慮する必要はない)瑞瑞は板を切断する際に特殊な方式を用い、この方式は1本の長さxのテンプレートを2本に切断する際にx単位のエネルギーを消費する必要がある.レイリーは無限のエネルギーを持っているが、今はエネルギー節約を提唱しているので、手本として、できるだけエネルギーを節約することにした.明らかに、全部でN-1回切断する必要がありますが、問題は、毎回どのように切るべきですか?最小消費するエネルギーの合計をプログラミングして計算してください.
にゅうしゅつりょくけいしき
入力形式:
1行目:整数N、必要な板の数を示す
2行目からN+1行目:動作ごとに1つの整数で、1枚の板の長さを表す
出力フォーマット:
最小消費電力の合計を表す整数
入出力サンプル
入力サンプル#1
3
8
5
8

出力サンプル#1
34

説明
長さ21の板を、1回目は長さ8と長さ13に切断し、21単位のエネルギーを消費し、2回目は長さ13の板を長さ5と8に切断し、13単位のエネルギーを消費し、計34単位のエネルギーを消費することで、エネルギー消費を最小限に抑える案です.
構想
合併果実の問題と同じ理屈だ.当時、問題を解くときはまだスタックや優先キューを習っていなかったので、この問題は優先キューでやりました.
最小の2つを見つけるたびに、彼らの和を保存した後、彼ら自身を削除し、合併果物を参照して合併し、それらの和を求めます.
#include 
#include 
#include 
using namespace std;
priority_queue,greater > pque;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	long long int i,n,s(0);
	cin>>n;
	for(i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		pque.push(x);
	}
	for(i=1;i<=n-1;i++)
	{
		int sum;
		sum=pque.top();
		pque.pop();
		sum=sum+pque.top();
		pque.pop();
		s=s+sum;
		pque.push(sum);
	}
	cout<