nbuoj 1587 最大乘积

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

Input
只一个正整数n,(3<=n<=10 000)。

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

Sample Input
10

Sample Output
2 3 5
30

思路: 由于需要将一个正整数n拆分成 几个互不相同的自然数,因此我们可以想到等差数列,假设前m项等差数列和为sum,sum<=n;第m+1项为x;x+sum>n。
那么,x怎么办呢?
假设,我有两个常数a,b。对于x如何分,才能使得乘积最大。可以列这样的一个式子:(a+x1)*(b+x2)。(x1+x2=x)那么只有当x1==x2的时候乘积最大。
因此,我们可以将x均分给m项的等差数列,此时得到的乘积最大。

#include<bits/stdc++.h>
using namespace std;
int a[1100];

string mul(string a,int b)
{
    string c;
    char s;
    int len=a.length(),ok=0;
    for(int i=len-1; i>=0; i--)
    {
        int temp=(a[i]-'0')*b+ok;
        ok=temp/10;
        s=temp%10+'0';
        c=s+c;
    }
    while(ok)
    {
        s=ok%10+'0';
        c=s+c;
        ok/=10;
    }
    return c;
}

int main()
{
    int n,sum=0,cnt=0;
    scanf("%d",&n);
    if(n == 3||n == 4){
        cout<<1<<" "<<n-1<<endl;
        cout<<n-1<<endl;
        return 0;
    }
    for(int i=2;sum+i<=n;i++){
        a[i-2]=i;
        sum+=i;cnt++;
    }
    int x=n-sum,y=x/cnt,z=x%cnt;
    for(int i=cnt-1;i>=0;i--){
        if(i>=cnt-z) a[i]+=y+1;
        else a[i]+=y;
    }
    for(int i=0;i<cnt;i++){
        printf("%d%c",a[i],i==cnt-1?'\n':' ');
    }
    string s1;
    s1+='1';
    for(int i=0;i<cnt;i++){
        s1=mul(s1,a[i]);
    }
    cout<<s1<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值