比赛描述

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

发表评论

邮箱地址不会被公开。 必填项已用*标注