题目描述
小K没事干,他要搬砖头,为了达到较好的减肥效果,教练规定的方式很特别:
每一次,小K可以把两堆砖头合并到一起,消耗的体力等于两堆砖头的重量之和。
经过 n-1次合并后, 就只剩下一堆了。小K在搬砖头时总共消耗的体力等于每次合并所耗体力之和。小K为了偷懒,希望耗费的体力最小。
例如有 3堆砖头,数目依次为 1、2、9 。可以先将 1 、 2 堆合并,新堆数目为3 ,耗费体力为 3 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 ,耗费体力为12 。所以总共耗费体力 =3+12=15。可以证明 15为最小的体力耗费值。
输入要求
共两行。
第一行是一个整数 n(1≤n≤1000) ,表示砖头堆数。
第二行n个整数,每个整数表示每堆砖头的砖头块数。
输出要求
一个整数,也就是最小的体力耗费值。
输入样例
3
1 2 9
输出样例
15
#include<iostream>
#include<algorithm>
using namespace std;
int n; // 砖块堆数
int a[1010] = {0}; // 每堆砖块数目
int main()
{
cin >> n;
for(int i=0; i<n; i++)
cin >> a[i];
int cost = 0; // 体力消耗
sort(a, a+n);
for(int i=0; i<n-1; i++)
{
int cost_i = a[i] + a[i+1];
int k = i+2;
// 后面有比堆积的砖块少的向前移一位
while(a[k]<cost_i && k<n) //分治思想,比cost_i小的放在左边
{
a[k-1] = a[k];
k++;
}
a[k-1] = cost_i;//由于while里k++了
cost += cost_i;
}
cout << cost << endl;
return 0;
}