poj 3253 类似霍夫曼贪心思想,优先队列的运用

每次选取堆里面最短的两根木头相加,再将所得和重新加入堆中,直到堆的size小于2

View Code
#include<queue>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct mycmp{
bool operator()(const int &a,const int &b)
{
return a>b;
}
};
int main()
{
priority_queue<__int64,vector<__int64>,mycmp> Q;
int n,num;
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&num);
Q.push(num);
}
__int64 a,b,sum=0;
while(Q.size()>=2)
{
a=Q.top();
Q.pop();
b=Q.top();
Q.pop();
Q.push(a+b);
sum+=(a+b);
}
printf("%I64d\n",sum);
}
return 0;
}



你可能感兴趣的:(优先队列)