当前位置:   article > 正文

2022第十三届蓝桥杯国赛真题javaB组_第十三届蓝桥杯javab组题目

第十三届蓝桥杯javab组题目

试题A: 重合次数

本题总分:5 分
【问题描述】 在同一天中,从上午6 点13 分22 秒到下午14 点36 分20 秒,钟表上的 分针和秒针一共重合了多少次? 注意时针、分针、秒针都围绕中心做匀速运动。
【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

这道题纯在纸上算的,502次,但是好像错了,关键就在于题目说时针、分针、秒针都围绕中心做匀速运动。那59分59秒的时候分针、秒针重合,0分0秒也重合,中间没有分开,不知道这两秒算1次还是2次,我是当2次计算结果是502。

试题B: 数数

本题总分:5 分
【问题描述】
任何一个大于1 的正整数都能被分解为若干个质数相乘,比如28 = 227
被分解为了三个质数相乘。请问在区间[2333333; 23333333] 中有多少个正整数可以被分解为12 个质数相乘?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

这道题起初代码是这样的,跑了3个半小时没跑出来,最后比赛结束了还在跑。。。

import java.util.Scanner;
public class Main1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 2333333; 23333333
		int n = 0;
		for (int i = 2333333; i <= 23333333; i++) {
			if (a(i))
				n++;
		}
		System.out.println(n);
	}

	private static boolean a(int i) {
		int n = 0, m = 2;
		while (i != 1) {
			while (i % m == 0) {
				n++;
				if (n > 12)
					return false;
				i /= m;
			}
			m++;
		}
		if (i != 1)
			n++;
		return n == 12;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

然后受大佬启发,明白了一个数的质因数的平方必然小于这个数,如果分解质因数时质数平方已经大于这个数,那么这个数如果不是1就是他质因数中最后一个质数。
例如260分解质因数,首先会分解出两个2,260/2/2=65,再分解出一个5,剩余13,下一个是7,因为7^2大于13,所以13就是260的最后一个质数
所以再代码中a方法中while加上条件 m * m <= i 就可以变快很多。

private static boolean a(int i) {
	int n = 0, m = 2;
	while (i != 1 && m * m <= i) {
		while (i % m == 0) {
			n++;
			if (n > 12)
				return false;
			i /= m;
		}
		m++;
	}
	if (i != 1)
		n++;
	return n == 12;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

试题C: 左移右移

时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
小蓝有一个长度为N 的数组,初始时从左到右依次是1;2; 3; : : : N。 之后小蓝对这个数组进行了M 次操作,每次操作可能是以下2 种之一:

  1. 左移x,即把x 移动到最左边。
  2. 右移x,即把x 移动到最右边。
    请你回答经过M 次操作之后,数组从左到右每个数是多少?
    【输入格式】
    第一行包含2 个整数,N 和M。 以下M 行每行一个操作,其中“L x”表示左移x,“R x”表示右移x。
    【输出格式】
    输出N 个数,代表操作后的数组。
    【样例输入】
    5 3
    L 3
    L 2
    R 1
    【样例输出】
    2 3 4 5 1
    【样例说明】
    样例中的数组变化如下:
    [1; 2; 3; 4; 5]
    [3; 1; 2; 4; 5]
    [2; 3; 1;4; 5]
    [2; 3; 4; 5; 1]
    【评测用例规模与约定】
    对于50% 的评测用例,1<=N; M <= 10000:
    对于100% 的评测用例,1 <= N; M <= 200000; 1 <= x <= N:

这道题用双向链表很好做,但是java中不熟悉如何继承linkedlist写一个查找到并删除,所以用了个数组模拟链表。因为n是小于等于20w的,所以假设20w个数全部左移或者全部右移,60w长度也够,题中开了70w,其实没有必要。
思路是从数组25w下标开始存放1-n,然后定义L、R索引,代表头尾指针,也就是数组当前用到了什么位置,如果某个数左移,将他原来下标位置值置为0(用于最后遍历输出),让L所在下标等于这个数,同时L–,右移同理,最终遍历L-R,输出不为0的数。

import java.util.Scanner;

public class Main3 {
	public static void main(String[] args) {
		int[] map = new int[700000];
		int l = 250000, r = 250000;
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		String[] s1 = s.split(" ");
		int n = Integer.parseInt(s1[0]);
		int m = Integer.parseInt(s1[1]);
		for (int i = 1; i <= n; i++) {
			map[r++] = i;
		}

		String s2;
		int nn;
		for (int i = 0; i < m; i++) {
			s2 = sc.nextLine();
			String[] s3 = s2.split(" ");
			nn = Integer.parseInt(s3[1]);
			int j;
			for (j = l - 5; j <= r + 5; j++) {
				if (map[j] == nn) {
					break;
				}
			}
			if ("L".equals(s3[0])) {
				map[--l] = map[j];
				map[j] = 0;
			} else {
				map[r++] = map[j];
				map[j] = 0;
			}
		}
		boolean flag = true;
		for (int i = l - 5; i <= r + 5; i++) {
			if (map[i] != 0) {
				if (flag) {
					System.out.print(map[i]);
					flag = false;
				} else {
					System.out.print(" " + map[i]);
				}
			}
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

试题D: 窗口

时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
在平时使用电脑的过程中,经常会打开各种各样的窗口,各个窗口会在桌 面上重叠,并按照一定的层次关系显示。有的窗口能够看到全部内容,而有的窗口只能看到局部。 现在给定一组操作桌面窗口的过程序列,请你通过ASCII 艺术图来绘制最 后桌面的状态。 已知桌面的大小为N * M,即桌面高度为N 个像素,宽度为M 个像素, 其中左上角坐标为(0; 0),右下角坐标为(N - 1; M - 1)。
对于窗口的操作有如下5 种:

  1. new 操作- 打开一个新窗口 new [PID] [top] [left] [height] [width] 如:new 12 20 30 80 100 表示打开一个PID 为12 的窗口,窗口左上角的坐标为(20; 30),该窗口宽 度为100 个像素,高度为80
    个像素;新创建的窗口,其层级为顶层。
  2. move 操作- 移动一个窗口 move [PID] [vertical] [horizontal] 如: move 12 -5 10 表示将PID 为12 的窗口在垂直方向上移动
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/74378?site
推荐阅读
相关标签