描述
题解
化分割为石子归并的思想,但不同的是,这个每段长度是可以任选的,所以不像石子归并的动态规划,而是使用贪心+优先队列。
代码
#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
int main(int argc, const char * argv[])
{
int N;
cin >> N;
int num;
priority_queue<int, vector<int>, greater<int> > q;
for (int i = 1; i <= N; i++)
{
scanf("%d", &num);
q.push(num);
}
int temp_1, temp_2;
int sum = 0;
while (q.size() > 1)
{
temp_1 = q.top(); // 每次先合并长度最小的
q.pop();
temp_2 = q.top();
q.pop();
sum += temp_1 + temp_2;
q.push(temp_1 + temp_2);
}
printf("%d\n", sum);
return 0;
}