nyoj55懒省事的小明(STL优先队列)

题目地址: 点击打开链接

题意:每次去消耗体力最小的堆相加并且入队,直到变为一堆

Code:
//一定邀记得用long long 因为体力在加的过程中会变得很大
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;

struct comp
{
    bool operator()(long long &x,long long &y)          //定义优先级,小的数优先出队
    {
        return x>y;
    }
};

priority_queue<long long,vector<long long>,comp>q;      //优先队列

int main()
{
    long long t,n,a,res,i;
    scanf("%lld",&t);
    while(t--)
    {
        int x,y;
        res=0;
        scanf("%lld",&n);
        for(i=0;i<n;i++)
        {
            scanf("%lld",&a);
            q.push(a);
        }
        while(q.size()!=1)
        {
            x=q.top();
            q.pop();
            y=q.top();
            q.pop();
            x=x+y;
            res+=x;
            q.push(x);
        }
        while(!q.empty())
        {
            q.pop();
        }
        printf("%lld\n",res);
    }
    return 0;
}

你可能感兴趣的:(nyoj55懒省事的小明(STL优先队列))