51nod1117【贪心】

来源:互联网 发布:mlily床垫怎么样知乎 编辑:程序博客网 时间:2024/06/02 04:12
思路:哈夫曼树~~哇塞,那么有道理。

利用堆维护:每次从堆里取两个最小加起来,然后还是最小的两个,最后只剩一根总的

#include <bits/stdc++.h>using namespace std;typedef long long LL;priority_queue<LL, vector<LL>, greater<LL> >q; // 定义小的先出队int main(){    while(!q.empty())        q.pop();    LL x,y,z;    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%lld",&x);        q.push(x);    }    LL ans=0;    while(q.size()>1)    {        x=q.top();q.pop();        y=q.top();q.pop();        z=x+y;        q.push(z);        ans=ans+z;    }    printf("%lld\n",ans);    return 0;}


0 0
原创粉丝点击