朴素算法 遍历实现小根堆
#include <iostream>
#include <algorithm>
using namespace std;
int arr[11000];
int main()
{
int N;
cin>>N;
for(int i = 0; i < N; i++)
cin>>arr[i];
sort(arr, arr + N);
int tf = 1, rs;
long long ans = 0;
while(tf < N)
{
rs = arr[tf - 1] + arr[tf];
ans += rs;
int i;
for(i = tf + 1; arr[i] <= rs && i < N; i++)
{
arr[i - 1] = arr[i];
}
arr[i - 1] = rs;
tf++;
}
cout<<ans<<endl;
return 0;
}
也可直接使用容器提升效率
#include <iostream>
#include <set>
using namespace std;
int main()
{
long long n, tmp, ans = 0;
cin>>n;
multiset < long long > s;
while(n--)
{
cin>>tmp;
s.insert(tmp);
}
while(s.size() > 1)
{
tmp = 0;
tmp += *s.begin();
s.erase(s.begin());
tmp += *s.begin();
s.erase(s.begin());
s.insert(tmp);
ans += tmp;
}
cout<<ans<<endl;
return 0;
}