思路: 很明显我们要满足的是要求每次得到的数组从小到大排列,然后每次取出前两个最小的,然后我们将其相加再次加入数组,直到只剩一个数字为止!
那么我们很容易想到STL容器中set,但是可能有重复数字,set会自动去重,怎么办?这个时候我们就要用到multiset了,其与set操作差不多,但是能保留重复数字!
不懂可以看大佬博客 AC代码如下
#include<bits/stdc++.h>
using namespace std;
multiset<int> mp;//允许有重复数字并且从小到大排列
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int res;
cin>>res;
mp.insert(res);
}
int ans = 0;//计算总数
int flag;
for(int i=1;i<=n-1;i++){//得到一个数需要执行n-1次操作
flag = 0;
flag = *mp.begin();//加第一个数
mp.erase(mp.begin());//删除
flag += *mp.begin(); //加第二个数
mp.erase(mp.begin());//删除
mp.insert(flag);
ans += flag;
}
cout<<ans<<endl;
return 0;
}