最优分解方案
题目描述:
为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的主要内容是做游戏。经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。
输入描述:
输入文件中只有1个数n(其中1<=n<=1000)。
输出描述:
输出文件中也是一个数,是乘积的最大值。
样例输入:
7
样例输出:
12
数据范围及提示:
需要高精才能AC
思路:
贪心+简单的数论
保证不重复的话 贪心策略是从2开始分 然后把最后剩下的数均匀分到后面
拿样例来举例子:
7
从2开始分
分出的数:2 3
还 剩 下:5 2
不能出现4了,但是还剩下2
就从后面开始逐个数加1
3+1=4,还剩下1
2+1=3,全部分完。
所以3*4=12就是答案。
高精度,写一个高精乘单精就AC了
#include<iostream>
using namespace std;
const int maxn=1010;
int n,tot,len,a[maxn],f[maxn];
void mul(int x)
{
for(int i=1;i<=len;i++)
f[i]=f[i]*x;
for(int i=1;i<=len;i++)
if(f[i]>9)
{
f[i+1]=f[i+1]+f[i]/10;
f[i]=f[i]%10;
}
while(f[len+1])
{
len++;
f[len+1]=f[len+1]+f[len]/10;
f[len]=f[len]%10;
}
}
int main()
{
cin>>n;
for(int i=2;i;i++)
{
if(n>=i)
a[++tot]=i,n=n-i;
else break;
}
while(n)
{
for(int i=tot;i>=1;i--)
if(n)
{
a[i]++;
n--;
}
else break;
}
len=1;f[1]=1;
for(int i=1;i<=tot;i++)
mul(a[i]);
for(int i=len;i>=1;i--)
cout<<f[i];
return 0;
}