POJ1032 Parliament(FOJ 1698、FOJ1823)

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=1698

AC 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

posted on 2010-05-01 21:58 CisJiong 阅读(789) 评论(0)  编辑 收藏 引用 所属分类: PKUFOJJAVA


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿(2)

随笔分类(16)

随笔档案(11)

最新随笔

最新评论