wtmsb
Time Limit: 1000/100MS (Java/Others)
Memory Limit: 131072/131072KB (Java/Others)
这天,AutSky_JadeKAutSky_JadeK 看到了n张图片,他忍不住说道:“我TM 社保!”。
每张图片有一个社保值,他可以合并两张图片,合并所得的图片的社保值是原来两张图片的社保值之和。
每次合并需要消耗的体力也是原来两张图片的社保值之和。 显然,n−1n−1
次合并之后,只剩下一张图片。
他想知道,在这个过程中,他消耗的总体力最少是多少。
Input
第一行包含一个整数n
,
第二行包含n
个整数A1,A2,…,An
,代表n
张图片的社保值。
Output
输出一行,包含一个整数,代表他消耗的总体力最少是多少。
Sample input and output
Sample Input | Sample Output |
---|---|
3 1 2 9 |
|
Hint
1≤n≤200001≤n≤20000 ,
1≤Ai≤2000
题意就是求和,一开始没搞懂题意,后来想明白了,就拿数据来说,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; }
有点难过(╯°Д°)╯︵┻━┻