UESTC 1599.wtmsb-STL(priority_queue)

wtmsb

Time Limit: 1000/100MS (Java/Others)    

Memory Limit: 131072/131072KB (Java/Others)

这天,AutSky_JadeKAutSky_JadeK 看到了n张图片,他忍不住说道:“我TM 社保!”。

每张图片有一个社保值,他可以合并两张图片,合并所得的图片的社保值是原来两张图片的社保值之和。
每次合并需要消耗的体力也是原来两张图片的社保值之和。 显然,n1n−1 次合并之后,只剩下一张图片。
他想知道,在这个过程中,他消耗的总体力最少是多少。

Input

第一行包含一个整数n
第二行包含n 个整数A1,A2,,An ,代表n 张图片的社保值。

Output

输出一行,包含一个整数,代表他消耗的总体力最少是多少。

Sample input and output

Sample InputSample Output
3
1 2 9

15

Hint

1n200001≤n≤20000 ,
1Ai2000

题意就是求和,一开始没搞懂题意,后来想明白了,就拿数据来说,1+2=3,再把3扔回去,3+9=12,所以就是3+12=15。

然而自己按自己想的写了一个(没有技术含量可言(;´д`)ゞ),样例啊,自己随便给的数据也都过了,但是交上就wa了,搞不清为什么。优先队列,要用这个写。

代码:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
const int N=2e4+10;
priority_queue<ll,vector<ll>,greater<ll> > gg;
int main(){
        int n,a,i,b;
        ll ans=0;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&a);gg.push(a);
        }
    int len=gg.size();
    while(len>=2){
        a=gg.top();gg.pop();
        b=gg.top();gg.pop();
        a=a+b;ans+=a;
        gg.push(a);len--;
    }
    printf("%lld
",ans);
     return 0;
}

有点难过(╯°Д°)╯︵┻━┻

 
 
原文地址:https://www.cnblogs.com/ZERO-/p/7155704.html