zoukankan      html  css  js  c++  java
  • JZOJ__Day 7:【普及模拟】max

    题目描述

    一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
    现在你的任务是将指定的正整数n分解成m个(m>=1)互不相同的自然数的和,且使这些自然数的乘积最大。

    输入

    只一个正整数n,(3≤n≤10000)。

    输出

    第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
    第二行是最大的乘积。

    样例输入

    10

    样例输出

    2 3 5
    30

    数据范围限制

    30%的数据 3<=n<=100

    程序

    #include<cstdio> 
    #include<iostream>
    using namespace std;
    int n,m,l,w,k[10001],a[10000],maxn=10000;
    void gaojin(int x)
    {
        int g=0,k=0;
        for (int i=maxn;i>=1;i--)
        {
            g=a[i]*x+k;
            a[i]=g%10;
            k=g/10;
        }
    }
    int main()
    {
        freopen("max.in","r",stdin);
        freopen("max.out","w",stdout);
        cin>>n;
        m=n;
        l=2;    
        if (n==4) 
        {
            cout<<n<<endl;
            cout<<n;
            return 0;
        }
        while (m>=l)
        {
            w++;
            k[w]=l;
            m-=l;
            l++;
        }
        if (m<=w) for (int i=m;i>=1;i--) k[w-i+1]++;
        else
        {
            for (int i=w;i>=1;i--) k[w-i+1]++;
            for (int i=m-w;i>=1;i--) k[w-i+1]++;
        }
        a[maxn]=1;
        for (int i=1;i<=w;i++) 
        {
            cout<<k[i]<<' ';
            gaojin(k[i]);
        }
        cout<<endl;
        l=1;
        while (a[l]==0) l++;
        for (int i=l;i<=maxn;i++) 
        cout<<a[i];
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    HDU 1536 sg-NIM博弈类
    Codeforces Round #361 (Div. 2)
    计蒜课复赛 联想电脑
    codevs3044 线段树+扫描线
    yii设置返回数据为JSON格式
    mysql中的查询优化
    计算两个经纬度间的距离
    一维数组打乱顺序shuffle函数
    array_filter可以去除数组中value为空的键值
    二维数组按某值分组求和
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500085.html
Copyright © 2011-2022 走看看