思路
大体思路很简单,相当于是每一次找最小的两个堆进行相加,但是如果直接使用sort排序的话有50分都超时了,于是我对其进行优化,去找符合相加后堆的位置,并且将该位置前的所有位置前移
提示
注释部分解开可以明确的看到每一步
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;ll sum = 0;
ll a[10010];
int main(){
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
a[n + 1] = 999999;
sort(a + 1,a + 1 + n);
int de = 1;
for(int i = 2;i <= n;i++) {
de++;
int t = a[i] + a[i - 1],k = 0;
sum += t;
for(int j = i + 1;j <= n;j++) {
if(t >= a[j] && t <= a[j + 1]) {
k = j;
break;
}
}
if(k) {
for(int j = de;j < k;j++) a[j] = a[j + 1];
a[k] = t;
}else a[i] = t;
// for(int i = de;i <= n;i++) {
// cout << a[i] << " ";
// }
// cout << endl;
}
cout << sum << endl;
return 0;
}