题目链接: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);
}
}
}