栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021第十二届蓝桥杯 java B组

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021第十二届蓝桥杯 java B组

B.卡片


首先看懂题目要求,从2021 个 0~9 中组合,问一共能拼到多少?
我们用一个数组来表示0~9 的数字个数,每次用到一个数字都相应的减去-1;直到count=-1;

package com.lanqiao2021;

import java.util.Arrays;

public class BMain {
	static int[] arr=new int[10];
	public static void main(String[] args) {
		Arrays.fill(arr, 2021);
		for(int i=1;i<20210;i++) {
			if(!isReach(i)) {
				System.out.println(i-1);
				break;
			}
		}
	}
	public static boolean isReach(int num) {
		while(num!=0) {
			arr[num%10]--;
			if(arr[num%10]<0) return false;
			num=num/10;
		}
		return true;
	}
}

答案: 3181

C.直线

package com.lanqiao2021;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CMain {
	static List positions=new ArrayList<>();
	public static void main(String[] args) {
		//y=k*x+b 确定k,b 则直线就唯一了
		for(int x=0;x<=19;x++) {
			for(int y=0;y<=20;y++) {
				for(int x1=0;x1<19;x1++) {
					for(int y1=0;y1<=20;y1++) {
						if(x!=x1) {
							double k=(double)(y1-y)/(x1-x);
							double b=y-k*x;
							positions.add(new Position(k,b));
						}
					}
				}
			}
		}
		
		Collections.sort(positions,(x1,x2)->{
			if (x1.k==x2.k) {
				return Double.compare(x1.b, x2.b);
			}else {
				return Double.compare(x1.k, x2.k);
			}
		});
		
		int count=1;
		for(int i=1;i1e-8||
					Math.abs(positions.get(i).b-positions.get(i-1).b)>1e-8	) {
				count++;
			}
		}
		count+=20;
		System.out.println(count);
		
	}
}

class Position{
	double k;
	double b;
	
	public Position() {
		
	}
	public Position( double k,double b) {
		this.k=k;
		this.b=b;
	}
}

答案:40257

D.货物摆放

先找出最简的公约数,通过一个数组封装,然后暴力法找出所有符合条件的选择count++;

package com.lanqiao2021;

import java.util.ArrayList;
import java.util.List;

public class DMain {
	public static void main(String[] args) {
		List list=new ArrayList<>();
		//先找出给定数的最简公约数
		long n=2021041820210418L;
		for(long i=1;i*i<=n;i++) {
			if(n%i==0) {
				list.add(i);
				if(n/i!=i) {
					list.add(n/i);
				}
			}
		}
		int count=0;
		long size = list.size();
		for(int i=0;i 
E.路径 


数据结构:图(邻接矩阵)
算法:朴素迪克斯算法
①先在未标记的b[]中找出距离原点最近的节点
②在刚加入的A节点的相邻节点找出 dist(A)+g[A][B]

package com.lanqiao2021;

import java.util.Arrays;

public class EMain {
	static final int INF = 0x3f3f3f3f;
    static final int N = 2030;
    static int[][] g = new int[N][N];
    static int[] dist = new int[N];
    static boolean[] s = new boolean[N];
    
    public static void main(String[] args) {
        //初始化图和距离
        for(int i = 1; i <= 2021; i++) {
            for(int j = i; j <= 2021; j++) {
                if(j - i > 21) {
                    g[i][j] = g[j][i] = INF;
                } else {
                    g[i][j] = g[j][i] = lcm(i, j);
                }
            }
        }
        Arrays.fill(dist, INF);
        dist[1] = 0;

        //朴素DijKstra
        for(int i = 1; i <= 2021; i++) {
            int v = -1;
            for(int j = 1; j <= 2021; j++) {
                if(!s[j] && (v == -1 || dist[v] > dist[j])) {
                    v = j;
                }
            }
            if(v!=-1) {
            	s[v] = true;
            }
            
            for(int j = 1; j <= 2021; j++) {
                dist[j] = Math.min(dist[j], dist[v] + g[v][j]);
            }
        }

        System.out.println(dist[2021]);
    }
    
    //求最大公约数
    public static int gcd(int a, int b) {
        //递归方式性能差些,但是写法简单
        //return b == 0 ? a : gcd(b, a % b);
        int t;
        while(b != 0) {
            t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
    //求最小公倍数
    public static int lcm(int a, int b) {
        return a * b / gcd(a, b);
    }
}
答案:10266837
F.时间显示

package com.lanqiao2021;

import java.util.Scanner;

public class FMain {
	public static void main(String[] args) {
		Scanner scan =new Scanner(System.in);
		long currentTime = scan.nextLong();
		scan.close();
		currentTime%=60*60*24*1000;
		currentTime/=1000;
		System.out.println(format(currentTime/3600)+":"+format((currentTime/60)%60)+":"+format(currentTime%60));
	}
	public static String format(long time) {
		if(time<10) return "0"+time;
		else return ""+time;
	}

}
46800999
13:00:00

G. 最少砝码

思路:用平衡三进制法,任何一个数都可以由一个三进制的数组合而来。

package com.lanqiao2021;

import java.util.Scanner;

public class GMain {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int n = scanner.nextInt();
		int sum=1; int cur=1;
		while(sum 
H.杨辉三角形 


分两步,杨辉三角形的第二列是从0 ,1,2,3,4,5…开始的等差数列,开始从后遍历,直到达到输出范围,没有找到对应的n 的话就说明,在下一行的第2列中 用公式是n*(n+1)/2+2;
否则的话就输出位置。

import java.util.Scanner;
public class 杨辉三角 {
    public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
        long n = scan.nextLong();//输入值,查找
        long[] arr =new long[44725];
        arr[0]=1;
        long k=1L;//k来定义位置
        if (n == 1) {
            System.out.println(1);
            return;
        }
        for (int i = 1;i<44725; i++) {
            for (int j = i; j>=1; j--) {
                arr[j] += arr[j - 1];//换行后,进行运算,减少内存
                if (arr[j] == n) {
                    System.out.println(k + i-j + 1);
                    return;//如果找到了就结束
                }
            }
            k+=(i+1);//每一行有i个值
        }
        System.out.println(((1 + n) * n / 2) + 2);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号