hdu1566

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1566

题解:这是一道思维题,要先去一个一个猜,发现就是枚举项数最多的话,面积就会是最大值(就是从2开始2,3,4,5,6...)每次枚举i时就n-i,到最后会出现三种情况:(注意:枚举到最后,边的数目一定是(i-2)条边!!!)

1.n-i与下一个要枚举的i相同时,表明这个周长正好可以表示成(2,3,4...)这样的形式,直接计算输出就好。

2.n-i与下一个要枚举的i小时,此时比较(i-2)与(n-i)的大小:

                        如果(i-2)<(n-i),那么每一个边都可以再加上(n-i)/(i-2),之后就变成了第二种情况

                        如果(i-2)>(n-i),那么就从后面的边开始往前每条边+1,再分别输出就行了。


import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin=new Scanner(new BufferedInputStream(System.in ));
        int n,i,j,k;
        BigInteger sum = null;
 
        while(cin.hasNext()){
            n=cin.nextInt();
            if(n<5){
                if(n==3)System.out.println("2 1 2");
                else if(n==4)System.out.println("2 1 3");
                sum=BigInteger.valueOf(n-1);
            }else{
            k=n;sum=BigInteger.valueOf(1);
            for(i=2;i<=k;i++) {
            	k-=i;
            }
            if(k==0){//正好等于连续递增的数列
            	System.out.print(i-2);
            	k+=2;
            	for(;k<i;k++) {
            		System.out.print(" "+k);
            		sum=sum.multiply(BigInteger.valueOf(k));
            	}
            	System.out.println();
            	
            }
            else{
            	System.out.print(i-2);
            	int addvalue=k/(i-2);//每一边的增加量
            	
            	int f=k%(i-2);//加完剩余的
            	
            	j=2+addvalue;
            	i+=addvalue;
            	
            	for(;j<i-f;j++){
            		System.out.print(" "+j);
            		sum=sum.multiply(BigInteger.valueOf(j));
            	}
            	j+=1;
            	for(;j<=i;j++){
            		System.out.print(" "+j);
            		sum=sum.multiply(BigInteger.valueOf(j));
            	}
            	System.out.println();
            	
             }
            
        }
            System.out.println(sum);
       }
    }
 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值