提供一个不一样的做法。

思路:

众所周知,这题每合并一次就排序一次会超时,所以我们不排序不进行完全的排序。

我们可以在第一次合并前先排一次,这样每次合并后只需对合并后的数进行冒泡,遇到比它小的就交换,遇到比它大的就停止,因为后面的数已经有序了。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>
using namespace std;
const int N=20000+5;
int n,a[N],ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n-1;i++){
ans+=a[i]+a[i+1];
int c;
c=a[i]+a[i+1];
a[i+1]=c;
for(int j=i+1;j<=n-1;j++){
if(a[j]>a[j+1]){
swap(a[j+1],a[j]);
}
else break;
}
}
cout<<ans;
return 0;
}