课后练习(循环之后)问题 V: 搬水果(数组)
题目描述
在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合并为一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果重量之和。当然经过n-1次合并之后,水果变为一堆。小明在合并水果时总共消耗的体力等于每次合并消耗体力之和。不同的合并顺序,总消耗体力不同。
输入n堆水果的重量,计算小明将水果合并为一堆时的最小总消耗体力。
输入
测试次数t
每组测试数据格式为:
水果堆数n,后跟n堆水果重量(假设为整数)
输出
对每组测试数据,输出最小总消耗体力。
样例输入
3
4 10 20 30 10
4 11 12 13 14
6 32 43 3 14 40 23
样例输出
130
100
367
提示
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,k,n,a[1000],t,x,y,z,s;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
s=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<2;j++)
{
x=0x3f3f3f3f;
if(j==0)
{
for(k=0;k<n;k++)
{
if(a[k]==0)
continue;
else if(a[k]<x)
{
x=a[k];
y=k;
}
}
}
else
{
for(k=0;k<n;k++)
{
if(a[k]==0||k==y)
continue;
else if(a[k]<x)
{
x=a[k];
z=k;
}
}
}
}
a[y]+=a[z];
s+=a[y];
a[z]=0;
}
cout<<s<<"\n";
}
}