早教吧 育儿知识 作业答案 考试题库 百科 知识分享

合并果子C/C++最好能详细点其他貌似要超时合并果子TimeLimit:1000MSMemoryLimit:65535KBSubmissions:2783Accepted:342Description在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成

题目详情
合并果子 C/C++ 最好能详细点 其他貌似要超时
合并果子
Time Limit:1000MS Memory Limit:65535KB
Submissions:2783 Accepted:342
Description
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和.因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值.例如有3种果子,数目依次为1,2,9.可以先将1、2堆合并,新堆数目为3,耗费体力为3.接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12.所以多多总共耗费体力=3+12=15.可以证明15为最小的体力耗费值.
Input
输入包括两行,第一行是一个整数n(1
▼优质解答
答案和解析
主要是排序,保证序列始终是从小到大,合并了堆后要再次排序,因为很可以合并堆后的堆比其余的堆的其中几个要大.
#include
using namespace std;
void px(int *,int);
void main()
{
int n,sum=0;//n是堆数,sum是体力总量
cin>>n;
int *a=new int[n];
for(int i=0;i>a[i];
px(a,n);//先排序
i=1;
int k=n;//k来保存n的值
while(n!=1)
{
sum+=a[i]+a[i-1];//当前耗费的体力
a[i]=a[i]+a[i-1];
i++;//a[i]代表最近一次合并的堆的果子数目
n--;//堆数少了1
px(a,k);//还要再排一次续,保证序列始终是从小到大的,这为了简便,还是按n个数排序
}
cout