zoukankan      html  css  js  c++  java
  • 最优分解方案(贪心+高精乘单精)

    最优分解方案

    题目描述:
    为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的主要内容是做游戏。经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数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;
    }
  • 相关阅读:
    Python-内置函数
    Python-匿名函数
    Python-函数递归-二分法
    Python-函数递归
    Day4-函数
    CSS-定位
    CSS-文本属性,文字属性
    CSS-浮动
    CSS-盒模型
    CSS-继承和层叠
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070949.html
Copyright © 2011-2022 走看看