当前位置: 代码迷 >> 综合 >> POJ 3253(优先队列)
  详细解决方案

POJ 3253(优先队列)

热度:18   发布时间:2023-11-26 03:46:50.0

这道题的思路有点怪 哈夫曼树的思路

先取两个最小的,再把这两个的和加入队列,把这两个小的数弹出队列

#include<iostream>
#include<cstdlib>
#include<sstream>
#include<cstdio>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;/*
3
8
5
5
*/
//先从无限长的木板上锯下长度为21的木板,花费21
//再从长度为21的木板上锯下长度为5的木板,花费5
//再从长度为16的木板上锯下长度为8的木板,花费8
//总花费34priority_queue<int,vector<int>,greater<int> >q;
int t1,t2,t;
signed main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&t);q.push(t);//入队}int sum=0;if(q.size()==1){t1=q.top();sum+=t1;q.pop();}else{while(q.size()>1){t1=q.top();q.pop();t2=q.top();q.pop();t=t1+t2;sum+=t;q.push(t);}}cout<<sum<<endl;return 0;
}