http://acm.pku.edu.cn/JudgeOnline/problem?id=1032给出n,把n分解为若干不相同数之和,使之乘积最大。
贪心,Discuss里面的思路:把n分解为从2开始的连续整数,如果有多,则从高位开始依次加1。如26,我们得到2+3+4+5+6,此时还剩余6(26-2-3-4-5-6),接下来从高位依次加一,变成3+4+5+6+7,还剩1,继续加给最大的7,最后答案是3+4+5+6+8.
#include<iostream>
using namespace std;
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=2;i<=n;i++)
n-=i;
i--;
if(i==n)
{
for(j=2;j<i;j++)
printf("%d ",j+1);
printf("%d\n",i+2);
}
else
{
if(n==0)
{
for(j=2;j<i;j++)
printf("%d ",j);
printf("%d\n",i);
continue;
}
for(j=2;j<i;j++)
{
if(i-j<n)
printf("%d ",j+1);
else
printf("%d ",j);
}
printf("%d\n",i+1);
}
}
return 0;
}
FZU1698 最大乘积 各种CE+PE+WA 无数次,终于不PE了。但不懂PE哪里了。
要求输出分解的数(不同)
http://acm.fzu.edu.cn/problem.php?pid=1698AC code
import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Main
{
public static void main(String[] args)
{
int n;
Scanner cin=new Scanner(System.in);
while(cin.hasNextInt())
{
n=cin.nextInt();
if(n<3)
continue;
if(n==3)
{
System.out.println("1 2");
System.out.println("2");
}
else if(n==4)
{
System.out.println("1 3");
System.out.println("3");
}
else if(n>=5&&n<10000)
{
int i;
BigInteger res=BigInteger.valueOf(1);
for(i=2;i<=n;i++) n-=i;
i--;
if(n==0)
{
for(int j=2;j<i;j++)
{
System.out.print(j+" ");
res=res.multiply(BigInteger.valueOf(j));
}
System.out.println(i);
res=res.multiply(BigInteger.valueOf(i));
}
else if(i==n)
{
for(int j=2;j<n;j++)
{
System.out.print((j+1)+" ");
res=res.multiply(BigInteger.valueOf((j+1)));
}
System.out.println(i+2);
res=res.multiply(BigInteger.valueOf((i+2)));
}
else
{
for(int j=2;j<i;j++)
{
if(i-j<n)
{
System.out.print((j+1)+" ");
res=res.multiply(BigInteger.valueOf((j+1)));
}
else
{
System.out.print(j+" ");
res=res.multiply(BigInteger.valueOf(j));
}
}
System.out.println(i+1);
res=res.multiply(BigInteger.valueOf(i+1));
}
System.out.println(res);
}
}
}
}
求一个数分解式的最大乘积(可以相同)。
对任意一个正整数x>3,令i=x/3,j=x%3,设S为分解式乘积最大的数 。
当 j=0 时 s=3的i次方
当 j=1 时 s=3的(i-1)次方*4
当 j=2 时 s=3的i次方*2
练习:FOJ1823 Lou 1 Zhuang
http://acm.fzu.edu.cn/problem.php?pid=1823