//把自然数N分解成若干个互不相同的正整数,使乘积最大;
/**
题意挺晦涩的,就是说要维持这个会议召开需要满足几个条件,而要会议召开最久需要这个条件尽可能久的维持
接着就需要了将整数N分解任意个不同的整数,使这些整数的乘积最大
将N分解为N=a1+a2+a3+..+ak
可以归纳出这么一些规律
1.a1>1 如果a1=1,那么将a1加到ak上,必然使得到的这个乘积大于原来的乘积
2.2>=a[i+1]-a[i]>=1,因为如果出现>2,可以将a[i+1],a[i]改为a[i+1]-1,a[i]+1,使得到的乘积更大
3.最多只有一个i,使得a[i+1]-a[i]=2
反证法,假设i
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int sum =0;
int h = 2;
while(1)
{
sum+=h;
if(sum>n)
{
sum-=h;
h--;
break;
}
h++;
}
int gg = n-sum;
int top = 1;
if(h==gg)
{
for(int i=3;i<=h;i++)
{
if(top)top=0 ;
else printf(" ");
printf("%d",i);
}
if(top)top=0 ;
else printf(" ");
printf("%d",h+2);
//例13
//3 4 6
}
else
{
for(int i=2;i<=h-gg;i++)
{
if(top)top = 0;
else printf(" ");
printf("%d",i);
}
for(int i=h-gg+1;i<=h;i++)
{
if(top)top = 0;
else printf(" ");
printf("%d",i+1);
}
//例16
//2 3 5 6
}
printf("\n");
}
}
//https://blog.csdn.net/nameofcsdn/article/details/53334497