问题 2491 --合并石子(完善程序)

2491: 合并石子(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 288  解决: 170
[提交][状态][命题人:]

题目描述

今天课间的时候,小明同学在学校的操场上发现了n<100堆大小不一的小石子,小明决定将 它们合并成一堆,但现在小明思考着这样一个问题:如何消耗最少的体力,把这n堆小石子合并成一堆?现已知合并所消耗的体力等于每次合并两堆小石子的重量之和每次合并,他会把其中的两堆小石子合并到一起,n堆小石子经过n-1次合并之后就只剩一堆了。

比如,n=3时表示共有3堆每堆重量分别是219。一种合并方案是29 合并,新堆重量是11,耗费体力为11;接着111合并新堆重量是12,耗费体力为12, 因此总消耗体力是11+12=23。另一种方案是先合并1和2,新堆重量是3,耗费体力为3, 接着39合并,新堆重量是12,耗费体力为12,因此总消耗体力是3+12=15。可以证明这样合并就是最少耗费体力的方法。

#include <iostream>
using namespace std;
int i, sum, n;
int a[10001];
void sort(int x)
{
    int i, j, temp;
    for (i = ____(1)____; i <= n - 1; i++) 
	{
        for (j = n; j >= ____(2)_____; j--) 
	{
            if (____(3)_____) 
	    {
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
}
int main()
{
    cin >> n;
    for (i = 1; i <= n; i++)  cin >> a[i];
    sum = 0;
    sort(1);
    for (int i = 1; i <= n - 1; i++) 
    {
        a[i + 1] = a[i] + a[i + 1];
        sum =  _____(4)_______;
        _____(5)______;
    }
    cout << sum;
}


输入

输出

样例输入
Copy
3
2 1 9
样例输出
Copy
15

提示

来源

 

[提交][状态]