2019 第十届蓝桥杯Java省赛B组部分题解

目录

试题A:组队试题B:不同子串
试题C:数列求值试题 D: 数的分解
试题 E: 迷宫(BFS试题 F: 特别数的和
试题 G: 外卖店优先级(模拟试题 H: 人物相关性分析
试题 I: 后缀表达式试题 J: 灵能传输 (前缀和)

试题A:组队

97+99+98+98+98 = 490

试题B:不同子串

答案:100

public class Main {
	public static void main(String[] args) {
		String s = "0100110001010001";
		HashSet<String> hs = new HashSet<>();
		for (int i = 0; i < s.length(); i++) 
		for (int j = i+1; j <= s.length(); j++) 
				hs.add(s.substring(i, j));
		System.out.println(hs.size());
	}
}
试题C:数列求值

答案:4659

public class Main {
	public static void main(String[] args) {
		int[] num = new int[20190400];
		num[1] = 1;
		num[2] = 1;
		num[3] = 1;
		for (int i = 4; i < num.length; i++) {
			num[i] = (num[i - 1] + num[i - 2] + num[i - 3]) % 10000;
		}
		System.out.println(num[20190324]);
	}
}
试题 D: 数的分解

答案:40785

public class Main {
	public static void main(String[] args){
		int res = 0;
		for (int i = 1; i < 2019; i++) {
			for (int j = i + 1; j < 2019; j++) {
				for (int k = j + 1; k < 2019; k++) {
					if ((i + j + k) == 2019 && !has2_or_4(i) && !has2_or_4(j) && !has2_or_4(k)) {
						res++;
					}
				}
			}
		}
		System.out.println(res);
	}

	public static boolean has2_or_4(int x) {
		int temp = x;
		while (temp != 0) {
			if (temp % 10 == 2 || temp % 10 == 4) {
				return true;
			}
			temp /= 10;
		}
		return false;
	}
}
试题 E: 迷宫
  • 答案:
DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
  • 用C++做的时候用文件读入的方式处理,用ecplise处理就挺方便了。就是简单的BFS搜索,因为是填空题也没有用栈做回溯处理,在每一个节点加上一个属性path来存储路径就可以了,空间复杂度要高一些。
public class Main {
	public static void main(String[] args){
		String s = "01010101001011001001010110010110100100001000101010"
				+ "00001000100000101010010000100000001001100110100101"
				+ "01111011010010001000001101001011100011000000010000"
				+ "01000000001010100011010000101000001010101011001011"
				+ "00011111000000101000010010100010100000101100000000"
				+ "11001000110101000010101100011010011010101011110111"
				+ "00011011010101001001001010000001000101001110000000"
				+ "10100000101000100110101010111110011000010000111010"
				+ "00111000001010100001100010000001000101001100001001"
				+ "11000110100001110010001001010101010101010001101000"
				+ "00010000100100000101001010101110100010101010000101"
				+ "11100100101001001000010000010101010100100100010100"
				+ "00000010000000101011001111010001100000101010100011"
				+ "10101010011100001000011000010110011110110100001000"
				+ "10101010100001101010100101000010100000111011101001"
				+ "10000000101100010000101100101101001011100000000100"
				+ "10101001000000010100100001000100000100011110101001"
				+ "00101001010101101001010100011010101101110000110101"
				+ "11001010000100001100000010100101000001000111000010"
				+ "00001000110000110101101000000100101001001000011101"
				+ "10100101000101000000001110110010110101101010100001"
				+ "00101000010000110101010000100010001001000100010101"
				+ "10100001000110010001000010101001010101011111010010"
				+ "00000100101000000110010100101001000001000000000010"
				+ "11010000001001110111001001000011101001011011101000"
				+ "00000110100010001000100000001000011101000000110011"
				+ "10101000101000100010001111100010101001010000001000"
				+ "10000010100101001010110000000100101010001011101000"
				+ "00111100001000010000000110111000000001000000001011"
				+ "10000001100111010111010001000110111010101101111000";
		int c = 50;
		int r = 30;
		char[][] map = new char[r][c];
		for (int i = 0, k = 0; i < r; i++, k += 50) {
			map[i] = s.substring(k, k + 50).toCharArray();
		}
		BFS(map, r, c);
	}

	public static void BFS(char[][] map, int r, int c) {
		int[] x = { 1, 0, 0, -1 };
		int[] y = { 0, -1, 1, 0 };
		char dirName[] = { 'D', 'L', 'R', 'U' };
		boolean[][] vis = new boolean[r][c];
		Queue<Node> queue = new LinkedList<Node>();
		Node node = new Node(0, 0, "");
		vis[0][0] = true;
		queue.offer(node);
		while (!queue.isEmpty()) {
			Node curNode = queue.poll();
			if (curNode.x == r - 1 && curNode.y == c - 1) {
				System.out.println(curNode.path);
				System.out.println(curNode.path.length());
				break;
			}
			for (int i = 0; i < 4; i++) {
				int nextX = curNode.x + x[i];
				int nextY = curNode.y + y[i];
				if (nextX >= 0 && nextX < r && nextY >= 0 && nextY < c && vis[nextX][nextY] == false) {
					if (map[nextX][nextY] == '0') {
						queue.offer(new Node(nextX, nextY, curNode.path + dirName[i]));
						vis[nextX][nextY] = true;
					}
				}
			}
		}
	}
}

//节点类
class Node {
	int x;
	int y;
	String path;

	public Node(int x, int y, String path) {
		super();
		this.x = x;
		this.y = y;
		this.path = path;
	}
}

试题 F: 特别数的和
  • 又是暴力,时间复杂度O(n)
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int res = 0;
		for (int i = 1; i <= n; i++) {
			if (isOk(i)) {
				res += i;
			}
		}
		System.out.println(res);
		scanner.close();
	}

	public static boolean isOk(int x) {
		int temp = x;
		while (temp != 0) {
			int num = temp % 10;
			if (num == 1 || num == 2 || num == 9 || num == 0)
				return true;
			temp /= 10;
		}
		return false;
	}
}
试题 G: 外卖店优先级
  • 这是以前看到别人的题解,时间复杂度O(MT),可能过不了全部样例,但是思路非常清晰,比赛的时候写出来也很不错。
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		Set<Integer> set = new HashSet<Integer>();
		int N = scanner.nextInt();
		int M = scanner.nextInt();
		int T = scanner.nextInt();
		int[][] orders = new int[M][2];
		for (int i = 0; i < M; i++) {	
			for (int j = 0; j < 2; j++) {
				orders[i][j] = scanner.nextInt();
			}
		}
		int[] priority = new int[N];
		int[] sign = new int[N];
		for (int i = 1; i <= T; i++) {
			for (int j = 0; j < M; j++) {
				if (orders[j][0] == i) {
					priority[orders[j][1] - 1] += 2;
					if (priority[orders[j][1] - 1] > 5) {
						set.add(orders[j][1] - 1);
					}
					sign[orders[j][1] - 1] = 1; //标记有订单的外卖店
				}
			}
			for (int j = 0; j < N; j++) {
				if (sign[j] == 0 && priority[j] > 0)	//其他外卖店没有订单,优先级减1
					priority[j]--;
				if (priority[j] <= 3) {	
					set.remove(j);
				}
			}
			sign = new int[N];
		}
		System.out.println(set.size());
		scanner.close();
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值