求助,不知道哪里有问题,按理说是对的,但测试数据太大,没法试。。。
Description 在一个操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次至少选2 堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大总费用和最小总费用。
Input
第1 行有2 个正整数n和k,表示有n堆石子,每次至少选2 堆最多选k堆石子合并。第2 行有n个数,分别表示每堆石子的个数。
Output
计算出的最大总费用和最小总费用。
Sample Input
7 3
45 13 12 16 9 5 22
Sample Output
593 199
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int a[100005],b[100005],n,c,mn,mx,k,num;
void sift( int i, int m)
{ int k=2*i;
a[0]=a[i];
while( k<=m )
{ if( k<m && a[k+1]>a[k] ) k++;
if( a[0]<a[k] )
{ a[i]=a[k];
i=k;
k=2*i;
}
else break;
}
a[i]=a[0];
}
void heapSort()
{ int j;
for( j=n/2; j>=1; j-- ) sift( j, n);
for( j=n; j>=2; j--)
{ a[0]=a[j];
a[j]=a[1];
a[1]=a[0];
sift( 1, j-1);
}
}
void min()
{
int i,p=0,j=0;
if (k>=num)
{
for (i=1;i<=num;i++)
mn+=a[i];
}
else
{
for (i=1;i<=k;i++)
p+=a[i];
mn+=p;
for (;i<=num;i++)
a[++j]=a[i];
a[++j]=p;
num=j;
sort(&a[1],&a[num+1]);
min();
}
}
void max()
{
int i,p=0;
if (num<=2)
{
for (i=num;i>=1;i--)
mx+=a[i];
}
else
{
p=a[num]+a[num-1];
mx+=p;
num-=2;
a[++num]=p;
max();
}
}
int main()
{
int i;
scanf ("%d%d",&n,&k);
num=n;
for (i=1;i<=n;i++)
scanf ("%d",&a[i]);
heapSort();
for (i=1;i<=n;i++)
b[i]=a[i];
min();
for (i=1;i<=n;i++)
a[i]=b[i];
num=n;
max();
printf ("%d %d",mx,mn);
return 0;
}