蓝桥杯 VIP 算法训练 Pyramids (55分)Java程序代码

import java.util.Scanner;

public class ALGO_180 {

	private static boolean t=true;
	private static int min=100;
	private static String l="";


	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int N;
		Scanner as=new Scanner(System.in);
		N=as.nextInt();
		as.close();
		
		int[] g=new int[100000];
		int[] e=new int[100000];
		String[] f=new String[100000];
		g[0]=1;
		f[0]="impossible";
		int i=0,d=1,s=1,w=2,dx=1,sx=1,wx=4;
		while(N>dx&&N>sx&&N>wx){
			i++;
			d++;
			dx=dx+(d)*(d);
			s=s+2;
			sx=sx+s*s;
			w=w+2;
			wx=wx+w*w;
			if(dx>sx&&wx>sx){
				g[i]=sx;
				f[i]=s+"L";
				dx=dx-(d)*(d);
				d--;
				wx=wx-w*w;
				w=w-2;
				
			}else if (sx>dx&&wx>dx) {
				g[i]=dx;
				f[i]=d+"H";
				sx=sx-s*s;
				s=s-2;
				wx=wx-w*w;
				w=w-2;
			}else if (dx>wx&&sx>wx) {
				g[i]=wx;
				f[i]=w+"L";
				sx=sx-s*s;
				s=s-2;
				dx=dx-(d)*(d);
				d--;
			}else if(sx==dx&&sx<wx) {
				g[i]=sx;
				f[i]=s+"L";
				i++;
				g[i]=dx;
				f[i]=d+"H";
				wx=wx-w*w;
				w=w-2;
			}else if(sx==wx&&sx<dx) {
				g[i]=sx;
				f[i]=s+"L";
				i++;
				g[i]=wx;
				f[i]=w+"L";
				dx=dx-(d)*(d);
				d--;
			}else if(wx==dx&&wx<sx) {
				g[i]=wx;
				f[i]=w+"L";
				i++;
				g[i]=dx;
				f[i]=d+"H";
				wx=wx-w*w;
				w=w-2;
			}else if(wx==dx&&wx==sx) {
				g[i]=wx;
				f[i]=w+"L";
				i++;
				g[i]=dx;
				f[i]=d+"H";
				i++;
				g[i]=wx;
				f[i]=w+"L";
			}
			
		}
		

		boolean p=true;
		while(N<g[i]){
			i--;
		}
		
	
	
		
	    f(g,f,i+1,N,e,0);
			if(t==false){
				p=false;	
					
			
			
			
		}
		
		if(p){
			System.out.println("impossible");
		}
		System.out.println(l);
//		f(g,f,i,N,e,0);
	}



	private static  void f(int[] g, String[] f, int i, int n, int[] e, int j) {
		// TODO 自动生成的方法存根
		if(j<2){
			for(int z=i;z>i/2;z--){
				e[j]=z;
				
				if(n-g[z]==0){
					
					if(j<min){
						l="";
						min=j;
						for(int w=0;w<=j;w++){
							l=l+f[e[w]]+" ";
						}
					}
					
					t=false;
					
					
					
				}
				f(g,f,z-1,n-g[z],e,j+1);
				
			}
		}else {
			for(int z=i;z>0;z--){
				e[j]=z;
				
				if(n-g[z]==0){
					
					if(j<min){
						l="";
						min=j;
						for(int w=0;w<=j;w++){
							l=l+f[e[w]]+" ";
						}
					}
					
					t=false;
					
					
					
				}
				f(g,f,z-1,n-g[z],e,j+1);
				
			}
		}
		
		
	}

	
	

}
由于比赛将近该题的难度颇高,且该题没有正确参考代码,估计本人的代码应该是最高得分。故先将这个代码分享下。待比赛结束再做修改和解释。有兴趣的可以关注下!

猜你喜欢

转载自blog.csdn.net/lslanding/article/details/79586971
今日推荐