題目連結:http://www.lydsy.com/JudgeOnline/problem.php?id=1724
題意:
你要將一塊長木板切成n段,長度分別為a[i](長木板的長度 = ∑ a[i])。
每一次切割的花費為被切割木板的長度。
問你切完的最小花費。
題解:
合併果子。
反過來想:切割 = 合併
貪心策略:每次選目前所有堆中最小的兩個合併。(儘可能少移動大的果子堆)
實現:優先佇列
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <queue> 5 6 using namespace std; 7 8 int n; 9 long long ans=0; 10 priority_queue<int,vector<int>,greater<int> > q; 11 12 int get_top() 13 { 14 int now=q.top(); 15 q.pop(); 16 return now; 17 } 18 19 int main() 20 { 21 cin>>n; 22 int a; 23 for(int i=0;i<n;i++) 24 { 25 cin>>a; 26 q.push(a); 27 } 28 while(q.size()>1) 29 { 30 int v1=get_top(); 31 int v2=get_top(); 32 ans+=v1+v2; 33 q.push(v1+v2); 34 } 35 cout<<ans<<endl; 36 }