最优分解方案(贪心+高精乘单精)

最优分解方案

题目描述:
为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的主要内容是做游戏。经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数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;
}
原文地址:https://www.cnblogs.com/cax1165/p/6070949.html