uva10954

Add All

Time Limit: 3000MSMemory Limit: Unknown64bit IO Format: %lld & %llu

[Submit]  [Go Back]  [Status]  

Description

Problem F
Add All
Input:
standard input
Output: standard output

Yup!! The problem name reflects your task; just add a set of numbers. But you may feel yourselves condescended, to write a C/C++ program just to add a set of numbers. Such a problem will simply question your erudition. So, let�s add some flavor of ingenuity to it.

Addition operation requires cost now, and the cost is the summation of those two to be added. So, to add 1 and 10, you need a cost of 11.If you want to add 1,2 and 3. There are several ways �

1 + 2 = 3, cost = 3

3 + 3 = 6, cost = 6

Total = 9

1 + 3 = 4, cost = 4

2 + 4 = 6, cost = 6

Total = 10

2 + 3 = 5, cost = 5

1 + 5 = 6, cost = 6

Total = 11

I hope you have understood already your mission, to add a set of integers so that the cost is minimal.

Input

Each test case will start with a positive number, N (2 ≤ N ≤ 5000) followed byN positive integers (all are less than 100000). Input is terminated by a case where the value of N is zero. This case should not be processed.

Output

For each case print the minimum total cost of addition in a single line.

Sample Input�������������� ������������Output for Sample Input

3

1 2 3

4

1 2 3 4

0

9

19


 

利用二维数组存储哈夫曼树的元素。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int q[100][5021];
int main()
{
    int n;
    //freopen("1.txt","r",stdin);
    while(cin>>n)
    {
        if(!n)break;
        else
        {
            for(int i=0; i<n; i++)
                cin>>q[0][i];
            sort(q[0],q[0]+n);
            int sum,k=1,f=0,l=0,i=0;
            sum=q[k][f]=q[k-1][i]+q[k-1][i+1];
            i=2;
            while(1)
            {
                if(i<n)
                {
                    int m1,m2;
                    if(q[k][f]>q[k-1][i])
                    {
                        m1=q[k-1][i++];
                        if(i<n&&q[k][f]>q[k-1][i])m2=q[k-1][i++];
                        else m2=q[k][f++];
                    }
                    else
                    {
                        m1=q[k][f++];
                        if(f<=l&&q[k][f]<q[k-1][i])m2=q[k][f++];
                        else m2=q[k-1][i++];
                    }
                    q[k][++l]=m1+m2;
                    sum+=q[k][l];
                }
                else
                {
                    k++;
                    i=f;
                    n=l+1;
                    if(i+1<n)
                    {
                        q[k][f=0]=q[k-1][i]+q[k-1][i+1];
                        sum+=q[k][f];
                        i+=2;
                    }
                    else break;
                    l=0;
                }
            }
            cout<<sum<<endl;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值