POJ 3253 優先佇列
阿新 • • 發佈:2018-12-21
Solution:只需要從板的集合裡取出最短的兩塊,並且把長度為兩塊板長度之和的板加入集合中即可,用優先佇列可以高效的實現。
AC_Code:
#include<iostream> #include<iomanip> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<queue> #include<stack> #include<vector> #include<map> #include<set> #include<cstdlib> #define ll long long #define ull unsigned long long #define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true #define debug(x) cout<<"X: "<<(x)<<endl #define de cout<<"************"<<endl #define lowbit(x) ((x)&(-x)) #define lson rt<<1 #define rson rt<<1|1 #define gcd(a,b) __gcd(a,b) #define lcm(a,b) a*b/(__gcd(a,b)) #define inf 0x3f3f3f3f//1e9+6e7 #define eps 1e-8 #define mod 1e9+7 #define N 10010 const double pi=acos(-1.0); using namespace std; int a[N]; int main() { int n; cin>>n; for(int i=0; i<n; i++) scanf("%d",&a[i]); ll ans=0; //宣告一個從小到大取出數值的優先佇列 priority_queue<int,vector<int>,greater<int>> que; for(int i=0; i<n; i++) que.push(a[i]); while(que.size()>1) { int l1,l2; l1=que.top(); que.pop(); l2=que.top(); que.pop(); //把兩塊木塊合併 ans+=l1+l2; que.push(l1+l2); } cout<<ans<<endl; return 0; }