贪心思想,每次都选最轻的两堆
采用优先队列实现。
#include <iostream>
using namespace std;
int n;
const int maxn = 10010;
int arr[maxn];
int total = 0;
void push(int x) {
total++;
arr[total] = x;
int j = total;
int i = j / 2;
while (i > 0 && arr[j] < arr[i]) {
swap(arr[i], arr[j]);
j = i;
i = j / 2;
}
}
int top() {
return arr[1];
}
void pop() {
arr[1] = arr[total];
total--;
int i = 1;
int j = i * 2;
if (j + 1 <= total && arr[j + 1] < arr[j])j = j + 1;
while (j <=total&&arr[j]<arr[i]) {
swap(arr[i], arr[j]);
i = j;
j = i * 2;
if (j + 1 <= total && arr[j + 1] < arr[j])j = j + 1;
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
push(x);
}
int ans = 0;
for (int i = 1; i < n; i++) {
int x = top();
pop();
int y = top();
pop();
ans += x + y;
push(x + y);
}
cout << ans;
}


京公网安备 11010502036488号