Time Limit: 3000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
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;
}