//优先队列 #include <stdio.h>//老大们可以注意了 ,一定要用long long 啊啊啊 我错了半页 就是一直用的int #include <queue> using namespace std; priority_queue<int,vector<int>,greater<int> >s;//先出小的。。感觉这样解释比较容易懂,greater换成less就是先出大的。 int main() { long long test,n,sum,x,y; scanf("%lld",&test); while(test--) { scanf("%lld",&n); for(int i=0;i<n;i++) scanf("%lld",&x),s.push(x);// if(n==1) { printf("%d\n",s.top()); s.pop(); continue; } sum=0; while(!s.empty()) { x=s.top(),s.pop(); y=s.top(),s.pop(); sum+=x+y; if(!s.empty()) s.push(x+y); } printf("%lld\n",sum); } return 0; }
---------------------------------------------------------------------------------------- #include <stdio.h>//直接插入 以前做的 因为vc不支持long long 就用的double 你懂得。。。 #include <string.h> #include <algorithm> using namespace std; int main() { double a[12001],b[12001],sum; int t,i,q,j,n,temp; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf",&a[i]); sort(a,a+n);//想插入 肯定要排序啦 for(i=1,j=0;i<n;i++) { b[j++]=a[i]+a[i-1]; a[i]=a[i]+a[i-1]; for(q=i;q<n-1;q++)//慢慢寻找0.0 { if(a[q]>a[q+1]) temp=a[q],a[q]=a[q+1],a[q+1]=temp; else break; } } sum=0; for(i=0;i<j;i++) sum+=b[i]; printf("%.lf\n",sum); } return 0; }