本题p1090
在经过分析后可得算法为哈夫曼树
由哈夫曼树的创建可得
将原数组sort后for(i,1~n-1)
循环a数组
新节点为a[i+1]=a[i]+a[i+1]
将其值加入ans(ans+=a[i+1])
再将a数组sort(a+i+1,a+n)
但是经分析可以直接用a[i+1]与后面的数据打擂
AC:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll ans;
int a[100005]={INT_MAX};
int main() {
int n, n1;
cin>>n;
for(int i=0; i<n; i++) {
cin>>a[i];
}
sort(a,a+n);
for(int i=0; i<n-1; i++) {
a[i+1]=a[i]+a[i+1];
ans+=a[i+1];
for(int j=i+1; j<n-1; j++) {
if(a[j]>a[j+1]) {
swap(a[j],a[j+1]);
} else {
break;
}
}
}
cout<<ans;
return 0;
}
用时最大32ms