比赛描述
众所周知,张老板非常有钱,而且非常喜欢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; }