码迷,mamicode.com
首页 > 其他好文 > 详细

合并果子(优先队列 +或者+哈夫曼)

时间:2015-05-01 22:33:38      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

合并果子

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 312  Solved: 113
[Submit][Status][Web Board]

Description

现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。

 

Input

第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。

 

Output

每组数据仅一行,表示最小合并代价。

 

Sample Input

2
4
1 2 3 4
5
3 5 2 1 4

Sample Output

19
33

HINT

 

(优先队列 +或者+哈夫曼)

 

#include<stdio.h>
#include<queue>
using namespace std;
struct node
{
   int a;
   friend bool operator<(node aa,node bb)
   {
       return aa.a>bb.a;
   }
};
int main()
{
    int n,t,a,sum;
    node bb,aa;
    scanf("%d",&t);
    while(t--)
    {
        priority_queue<node>q;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            bb.a=a;
            q.push(bb);
        }
        sum=0;
        while(!q.empty())
        {
            aa=q.top(); q.pop();//printf("%d ",aa.a);
            if(n==1)  break;
            bb=q.top(); q.pop();
            n--;
            aa.a+=bb.a;
            sum+=aa.a;
            q.push(aa);
        }
        printf("%d\n",sum);
    }
}
 
/**************************************************************
    Problem: 1588
    User: aking2015
    Language: C++
    Result: Accepted
    Time:92 ms
    Memory:1064 kb
****************************************************************/

 

合并果子(优先队列 +或者+哈夫曼)

标签:

原文地址:http://www.cnblogs.com/yuyixingkong/p/4471260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!