小蒜想将正整数 nn 拆分为若干个互不相等的自然数之和,问如何拆分可以使得它们的乘积最大?
输入格式
一个正整数 nn。n \le 10000n≤10000。
输出格式
一行,包含若干个互不相等的自然数——乘积最大的一种拆分方案。
这些自然数需从小到大输出,两个自然数之间用单个空格隔开。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
15
样例输出复制
2 3 4 6
本题个人觉得应该要掌握一点数学的偏门技巧。。。这个题的关键点很难想到,结论是:把一个数拆的尽量多,这样乘出来的数就会越大,(1除外),那么这题便可以从2开始向后拆,但是有一个点需要注意,如果是17的话,那么可以拆成2,3,4,5,3 或者2,4,5,6,如果在允许数字重复的情况下,选择第一种,而本题是数字不能重复,所以只能将3拆开加到后三个上面去,保证后面的值越大越好,并且3要均分到后面几个上面去,而不能直接加到最后一个,因为这样没有前面这种情况的值大,直接上AC代码把。。。
#include<iostream>
using namespace std;
const int max_n=20000;
/*
@author:HaiRu,WU
@from:AHUT
*/
int main(){
int n;
int a[max_n];
cin >> n;
if(n==1){
cout<<n<<endl;
return 0;
}
int i;
for(i=2;i<=n;i++){
a[i]=i;
n=n-i;
}
i--;
int j=i;
while(n!=0 && j>=2){
a[j]++;
j--;
n--;
}
if(n){
a[i]+=n;//还有剩余,加到最后的最大值那里
}
for(int k=2;k<=i;k++){
cout<<a[k]<<" ";
}
return 0;
}