还是老贺猛啊,我看到了我们学校夺金的希望。这题问了他之后他给出了我证明。
题意:给定你一个数N,要求拆分成一系列数之和,要求这些数之积越大越好。
解法:贪心。显然数被分成越多,它们之积就越大,这个不证明了。这样我们从2开始拆分n,一直到k,令Sum = 2+3+……+k,
则有n-sum<=k,这样我们还得把剩下的n-sum个数分配出去,怎么分配呢?因为不能存在相同的数,所以从后往前分配,对k,……,3,2依次加1,
因为前面只有k-1个数,而剩余的可能有k个,这样前面每个数分配都加1之后还有多,怎么办,接着k开始加,这样就OK了。数越平均,积就越大。
#include <stdio.h>
#define N 105
int a[N];
int main()
{
int t, n, top;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
top = 0;
for(int i = 2; n >= i; i++)
{
a[++top] = i;
n -= i;
}
for(int i = top; n && i; i--)
{
a[i]++;
n--;
}
a[top] += n;
for(int i = 1; i < top; i++)
{
printf("%d ", a[i]);
}
printf("%d\n", a[top]);
if(t) printf("\n");
}
return 0;
}