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

本文分享了一个高难度比赛中的算法实现,通过动态更新多个数组来寻找特定数值的组合方式,并记录最优解。尽管缺少详细注释,但该代码为解决特定数学问题提供了一种可行的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
				
			}
		}
		
		
	}

	
	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值