uva 10954 - Add All

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 by N 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

 

 

想起了noip的合併果子,那時候還年輕,只會快排+插排每次找最小的2個,然後知道了可以用堆去實現維護一個優先隊列,現在終於會用stl偷懶了,優先級比較函數比較難記,老忘記每次都要百度出來;

#include<stdio.h>
#include<queue>
using namespace std;
struct cmp
{
 bool operator() (const int &a, const int &b)
 {return a>b;}
};
priority_queue<int,vector<int>,cmp> q;
int main()
{
 int n,i,x,y;
 while (scanf("%d",&n),n)
 {
  for (i=1;i<=n;i++)
  {
   scanf("%d",&x);
   q.push(x);
  }
 x=0;
 while (q.size()>1)
 {
  y=q.top();
  q.pop();
  y+=q.top();
  q.pop();
  x+=y;
  q.push(y);
 }
 q.pop();
 printf("%d\n",x);
 }
 return 0;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章