UVA10954 Add All (优先队列)

题解:

有n(n<=5000)个数的集合S,每次可以从S中删除两个数,然后把它们的和放回集合里面,直至剩下最后一个数,每次操作的开销等于删除两个数之和,求最小总开销

优先队列

代码

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 100000
#define LL long long
int cas=1,T;
int main()
{
    int n,x;
    while (scanf("%d",&n) && n)
    {
        priority_queue<int,vector<int>,greater<int> >q;
        for (int i =0;i<n;i++)
        {
            scanf("%d",&x);
            q.push(x);
        }
        int ans = 0;
        for (int i = 0;i<n-1;i++)
        {
           int a = q.top();q.pop();
           int b = q.top();q.pop();
           ans+=a+b;
           q.push(a+b);
        }
        printf("%d\n",ans);
    }

    return 0;
}

题目

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, lets 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 1 + 3 = 4, cost = 4 2 + 3 = 5, cost = 5
3 + 3 = 6, cost = 6 2 + 4 = 6, cost = 6 1 + 5 = 6, cost = 6
Total = 9 Total = 10 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
3
1 2 3
4
1 2 3 4
0
Sample Output
9
19

你可能感兴趣的:(UVA10954 Add All (优先队列))