還是老賀猛啊,我看到了我們學校奪金的希望。這題問了他之后他給出了我證明。
題意:給定你一個數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;
}