ACM模版

描述

题解

化分割为石子归并的思想,但不同的是,这个每段长度是可以任选的,所以不像石子归并的动态规划,而是使用贪心+优先队列。

代码

#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;
}

参考

51Nod 1021 石子归并