题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=55
1 3 1 2 9
15
分析:
1:首先是优先队列。 每次都将最小的两个数相加,直到只剩下最后一个元素。
2:由于数据较大, n= 1.2*10^4 ,ai= 2*10^4 sum 最大值为 lg(n) *n*a[i] , 只能用longlong ,否则wa.
代码如下:
#include <cstdlib> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #include <iostream> #include <vector> #include<string> #include<cstring> #include<string.h> #include<set> #include<queue> #include<stack> using namespace std; typedef long long LL; #define N 12005 int n; int a[N]; struct cmp{ // 单元素的比较函数 bool operator()(LL &a,LL &b) { return a>b; } }; LL solve() { LL sum=0,x; priority_queue<LL,vector<LL>,cmp>q; // 优先队列的实例化。 for(int i=0; i<n;i++) q.push(a[i]); while(q.size()!=1) { x=q.top(); q.pop(); x+=q.top(); q.pop(); sum+=x; q.push(x); } return sum; } int main() { int t; cin>>t; while(t--) { cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } printf("%lld\n",solve()); } return 0; }
懒省事的小明 + 优先队列(单元素的比较函数) + longlong,布布扣,bubuko.com
懒省事的小明 + 优先队列(单元素的比较函数) + longlong
原文:http://www.cnblogs.com/zn505119020/p/3620899.html