比赛描述
众所周知,张老板非常有钱,而且非常喜欢surface book。某一天,张老板突发奇想,把所有店里面卖的surface book全部买了下来,并且按照不同的店将surface book分成了不同的堆。张老板后悔这个决定,为了制造更壮观的场面,他想将所有的surface book放在一堆。
每一次搬动,张老板都可以将两堆surface book合为一堆,消耗的体力等于两堆surface book数量之和。显而易见的是,所有的surface book经过n-1次合并之后,就只剩下一堆了。张老板在搬动时总共消耗的体力等于每次搬动所耗体力之和。
由于之后还要和学姐约会,张老板想在搬动surface book的时候尽可能地节省体力。作为资深僚机的你,需要帮助张老板解决这个问题。假设每台surface book的重量都为1,并且已知店铺数和每个店铺购买的surface book的数目,你的任务是设计出搬动的次序方案,使张老板耗费的体力最少,并输出这个最小的体力耗费值。
输入
输入包括两行,第一行是一个整数n(1<=n<=10000),表示店铺数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i个店铺购买的surface book的数目。 输出 输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。 样例输入 3 1 2 9 样例输出 15
#include<bits/stdc++.h>
using namespace std;
int n, a, x, ans;
priority_queue<int, vector<int>, greater<int> >q;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a);
q.push(a);
}
for(int i = 1; i < n; i++)
{
x = 0;
x += q.top();
q.pop();
x += q.top();
q.pop();
ans += x;
q.push(x);
}
printf("%d",ans);
return 0;
}