蓝桥杯第十二届模拟赛(二)(Java)

小明要用二进制来表示 1 到 10000 的所有整数,要求不同的整数用不同的二进制数表示,请问,为了表示 1 到 10000 的所有整数,至少需要多少个二进制位?

解答:
2^13=8192
2^14=16384
2^ 14 >10000了,此时有15位(因为最右边是2^0开始的)
也就是说:14位就可以表示1~2^14-1
所以14位就已经足够表示
答案提交:14

请问在 1 到 2020 中,有多少个数既是 4 的整数倍,又是 6 的整数倍。

答案提交:168

一个无向图包含 2020 条边,如果图中没有自环和重边,请问最少包含多少个结点?

答案提交:
对于这个问题,就是找出一个最小的n,让它满足n*(n - 1) / 2 >= 2020
在这里插入图片描述
不够4040,所以只能取65!
运算过程可能出现小数,但是因为整数的性质,直接去掉了后面的小数,记得验证一下

补充:
一个无向图(没有自环和重边),最多包含n * (n-1)/2条边,最少包含n-1条边。

请问有多少个序列满足下面的条件:
  1. 序列的长度为 5。
  2. 序列中的每个数都是 1 到 10 之间的整数。
  3. 序列中后面的数大于等于前面的数。

public class 序列 {
	public static void main(String[] args) {
		HashSet<String> set = new HashSet<>();
		for (int i = 1; i <= 10; i++) {
			for (int j = 1; j <= 10; j++) {
				for (int k = 1; k <= 10; k++) {
					for (int m = 1; m <= 10; m++) {
						for (int n = 1; n <= 10; n++) {
							if (i <= j && j <= k && k <= m && m <= n) {
								String temp = i + "" + j + "" + k + "" + m + "" + n;
								set.add(temp);
							}
						}

					}
				}
			}
		}
		System.out.println(set.size());
	}
}

答案提交:2002

两个字母之间的距离定义为它们在字母表中位置的距离。例如 A 和 C 的距离为 2,L 和 Q 的距离为 5。
对于一个字符串,我们称字符串中两两字符之间的距离之和为字符串的内部距离。
例如:ZOO 的内部距离为 22,其中 Z 和 O 的距离为 11。
请问,LANQIAO 的内部距离是多少?

public class 字母间距 {
	public static void main(String[] args) {
		String s = "LANQIAO";
		char[] cs = s.toCharArray();
		int len = 0;
		for (int i = 0; i < cs.length; i++) {
			for (int j = i + 1; j < cs.length; j++) {
				len += (int) Math.abs(cs[j] - cs[i]);
			}
		}
		System.out.println(len);
	}
}

答案提交:162

问题描述
  现在时间是 a 点 b 分,请问 t 分钟后,是几点几分?
输入格式
  输入的第一行包含一个整数 a。
  第二行包含一个整数 b。
  第三行包含一个整数 t。
输出格式
  输出第一行包含一个整数,表示结果是几点。
  第二行包含一个整数,表示结果是几分。

样例输入1
3
20
165
样例输出1
6
5
样例输入2
3
20
175
样例输出2
6
15

数据规模和约定
  对于所有评测用例,0 <= a <= 23, 0 <= b <= 59, 0 <= t, t 分钟后还是在当天。

public class Time {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int t = sc.nextInt();
		// a点b分, t分钟后,是几点几分
		// 边界情况:(1)b+t>=60(2)当a=23时,应该注意是否到达第二天
		// 且b 可能很大!所以应该用/和 %来找到正确的时间
		int m = b + t;
		if (m >= 60) {
			a += m / 60;
			m = m % 60;
		}
		a = a % 24;//虽然题上告诉了,当天,但是针对不是当天的情况,记得a%24
		System.out.println(a);
		System.out.println(m);
	}
}

7、平行四边形:底*高
8.

问题描述
  小蓝有一张黑白图像,由 n * m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。
  现在,小蓝准备对图像进行模糊操作,操作的方法为:
  对于每个像素,将以它为中心 3 * 3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
  请注意每个像素都要用原图中的灰度值计算求和。

输入格式
  输入的第一行包含两个整数 n, m。
  第 2 行到第 n + 1 行每行包含 m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
输出格式
  输出 n 行,每行 m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。

样例输入
3 4
0 0 0 255
0 0 255 0
0 30 255 255
样例输出
0 42 85 127
5 60 116 170
7 90 132 191

数据规模和约定
  对于所有评测用例,1 <= n, m <= 100。

public class 图像 {
	// 上,下,左,右,左上,右上,左下 ,右下
	static int[] dirX = { -1, 1, 0, 0, 1, 1, -1, -1 };
	static int[] dirY = { 0, 0, -1, 1, -1, 1, -1, 1 };
	static int n;
	static int m;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();// 行
		m = scanner.nextInt();// 列
		int[][] a = new int[n][m];
		int[][] copy = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				a[i][j] = scanner.nextInt();
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				copy[i][j] = f(a, i, j, 1, a[i][j]);
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				System.out.print(copy[i][j] + " ");
			}
			System.out.println();
		}
	}

	public static int f(int[][] a, int row, int col, int cnt, int sum) {
		for (int i = 0; i < dirX.length; i++) {
			int x = row + dirX[i];
			int y = col + dirY[i];
			if (x < 0 || y < 0 || x >= n || y >= m) {
				continue;
			}
			cnt++;
			sum += a[x][y];
		}
		return sum / cnt;

	}
}

问题描述
  小蓝负责花园的灌溉工作。
  花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。
  小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
  每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
  给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?

输入格式
  输入的第一行包含两个整数 n, m。
  第二行包含一个整数 t,表示出水管的数量。
  接下来 t 行描述出水管的位置,其中第 i 行包含两个数 r, c 表示第 r 行第 c 列有一个排水管。
  接下来一行包含一个整数 k。
输出格式
  输出一个整数,表示答案。

样例输入
3 6
2
2 2
3 4
1
样例输出
9
样例说明
  用1表示灌溉到,0表示未灌溉到。
  打开水管时:
  000000
  010000
  000100
  1分钟后:
  010000
  111100
  011110
  共有9个方格被灌溉好。

数据规模和约定
  对于所有评测用例,1 <= n, m <= 100, 1 <= t <= 10, 1 <= k <= 100。

public class 花园灌溉 {
	static int[][] grid;
	static boolean[][] flag;
	static int n;
	static int m;
	static int[][] dir = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		m = scanner.nextInt();
		grid = new int[n][m];
		flag = new boolean[n][m];
		int t = scanner.nextInt();// 水管的数量
		for (int i = 0; i < t; i++) {
			int row = scanner.nextInt() - 1;
			int col = scanner.nextInt() - 1;
			grid[row][col] = 1;
		}
		int k = scanner.nextInt();// K分钟
		int time = 1;
		int ans = t;
		while (time <= k) {
			flag = new boolean[n][m];
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (grid[i][j] == 1 && !flag[i][j]) {
						flag[i][j] = true;
						ans += f(grid, i, j, 0);
					}
				}
			}
			time++;
			// for (int i = 0; i < grid.length; i++) {
			// System.out.println(Arrays.toString(grid[i]));
			// }
		}

		System.out.println(ans);
	}

	public static int f(int[][] grid, int row, int col, int cnt) {
		for (int i = 0; i < 4; i++) {
			int x = row + dir[i][0];
			int y = col + dir[i][1];
			if (x < 0 || y < 0 || x >= n || y >= m) {
				continue;
			}
			if (grid[x][y] != 1 && !flag[x][y]) {
				flag[x][y] = true;
				grid[x][y] = 1;
				cnt++;
			}
		}
		return cnt;
	}
}

最后一题需要dp,不会,end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值