题目大意:给出n个数,要将n个数相加,每次相加所得的值为当次的计算量,完成所有的求和运算后,要求总的计算量最小。
解题思路:只要每次挑选最小的两个数出来相加就可以了,然后将和当成新的一个数放回数组。
#include <stdio.h>
#include <set>
using namespace std;
int n, ans;
multiset<int> s;
void solve() {
int sum = 0;
ans = 0;
multiset<int>::iterator it1, it2;
while (1) {
if (s.size() == 1) break;
it1 = s.begin();
it2 = it1++;
sum = (*it1) + (*it2);
s.erase(it1);
s.erase(it2);
ans += sum;
s.insert(sum);
}
printf("%d\n", ans);
}
int main() {
int a;
while (scanf("%d", &n), n) {
s.clear();
for (int i = 0; i < n; i++) {
scanf("%d", &a);
s.insert(a);
}
solve();
}
return 0;
}