Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:
留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。
【输入文件】
输入文件best.in中只有1个数n(其中1<=n<=1000)。
【输出文件】
输出文件best.out中也是一个数,是乘积的最大值。
【样例输出】
7
【样例输出】
12
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u225
【题解】
题解同http://blog.csdn.net/harlow_cheng/article/details/54743629
【完整代码】
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
#define pb push_back
#define LL long long
int n,now = 2,len,ans[1000],le;
vector <int> v;
int main()
{
cin >> n;
if (n==2)
{
puts("1");
return 0;
}
if (n==3)
{
puts("2");
return 0;
}
if (n==4)
{
puts("3");
return 0;
}
while (n>=now)
{
v.pb(now);
n-=now;
now++;
}
len = v.size(),now = len-1;
while (n)
{
v[now]++;
n--;
now--;
if (now<0)
now = len-1;
}
ans[1] = 1;
le = 1;
for (int i = 0;i <= len-1;i++)
{
int x = 0;
for (int j = 1;j <= le;j++)
{
ans[j] = ans[j]*v[i] + x;
x = ans[j]/10;
ans[j] = ans[j]%10;
}
while (x>0)
{
le++;
ans[le] = x;
x = ans[le]/10;
ans[le]%=10;
}
}
for (int i = le;i >= 1;i--)
printf("%d",ans[i]);
return 0;
}