- 藍橋杯 Java B組 省賽決賽 真題詳解及小結匯總【2013年(第4屆)~2021年(第12屆)】
- 第11屆 藍橋杯-第1、2次模擬(軟體類)真題-(2020年3月、4月)-官方講解視頻
- 說明:大部分題解思路及程式代碼 源自 藍橋杯 官網視頻(Java B組歷年真題決議) —— 鄭未老師,
- 2013年 第04屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2014年 第05屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2015年 第06屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2016年 第07屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2017年 第08屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2018年 第09屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2019年 第10屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2020年 第11屆 藍橋杯 第1次模擬賽真題詳解及小結【Java版】(校內模擬)// 官方講解視頻
- 2020年 第11屆 藍橋杯 第2次模擬賽真題詳解及小結【Java版】// 官方講解視頻
- 2020年 第11屆 藍橋杯 C/C++ B組 省賽真題詳解及小結【第1場省賽 2020.07.05】【Java版】
- 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2020.07.05】
- 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】
- 2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.07.05】
- 2021年 第12屆 藍橋杯 第1次模擬賽真題詳解及小結【Java版】
- 2021年 第12屆 藍橋杯 第2次模擬賽真題詳解及小結【Java版】
- 2021年 第12屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2015年 第06屆 藍橋杯 Java B組 決賽真題詳解及小結
- 2016年 第07屆 藍橋杯 Java B組 決賽真題詳解及小結
- 2017年 第08屆 藍橋杯 Java B組 決賽真題詳解及小結
- 2018年 第09屆 藍橋杯 Java B組 決賽真題詳解及小結
- 2019年 第10屆 藍橋杯 Java B組 決賽真題詳解及小結
- 2020年 第11屆 藍橋杯 Java B組 決賽真題詳解及小結
目 錄
模擬賽網頁截圖
一、試題A——答案:168
解法一:回圈+check
二、試題B——答案:14
解法一:進制轉換
三、試題C——答案:2002
解法一:暴力回圈+check
四、試題D——答案:65
解法一:找規律(累加求和)
五、試題E——答案:162
解法一:雙重for回圈遍歷所有組合
六、試題F
解法一:整數相乘
七、試題G
解法一:整數運算
解法二:計算增加的小時數
八、試題H
解法一
九、試題I
解法一
十、試題J
解法一
小結
僅供參考,歡迎指正!
模擬賽網頁截圖
一、試題A——答案:168
問題描述
請問在 1 到 2020 中,有多少個數既是 4 的整數倍,又是 6 的整數倍,
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
解法一:回圈+check
【答案】:168
package simulationMatch_12_2021_2;
public class _01A {
public static void main(String[] args) {
int answer = 0;
for (int i = 1; i <= 2020; i++) {
if (i % 4 == 0 && i % 6 == 0) {
answer++;
System.out.print(i + "、");
}
}
System.out.println();
System.out.println(answer);
}
}
二、試題B——答案:14
問題描述
小明要用二進制來表示 1 到 10000 的所有整數,要求不同的整數用不同的二進制數表示,請問,為了表示 1 到 10000 的所有整數,至少需要多少個二進制位?
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
解法一:進制轉換
【答案】:14
【決議】:1 到 10000 的所有整數中,最大的數字為10000,十進制數字10000 轉 二進制 為:10 0111 0001 0000,用了14位二進制位,
在線進制轉換網址:https://tool.oschina.net/hexconvert
package simulationMatch_12_2021_2;
public class _02B {
public static void main(String[] args) {
for (int i = 1; i <= 10000; i++) {
String temp = Integer.toBinaryString(i);
System.out.println(temp);
}
}
}
三、試題C——答案:2002
問題描述
請問有多少個序列滿足下面的條件:
1. 序列的長度為 5,
2. 序列中的每個數都是 1 到 10 之間的整數,
3. 序列中后面的數大于等于前面的數,答案提交
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
解法一:暴力回圈+check
【答案】:2002
package simulationMatch_12_2021_2;
public class _03C {
public static void main(String[] args) {
int answer = 0;
for (int a = 1; a <= 10; a++) {
for (int b = 1; b <= 10; b++) {
for (int c = 1; c <= 10; c++) {
for (int d = 1; d <= 10; d++) {
for (int e = 1; e <= 10; e++) {
if (a <= b && b <= c && c <= d && d <= e) {
answer++;
System.out.println(a + "、" + b + "、" + c + "、" + d + "、" + e);
}
}
}
}
}
}
System.out.println(answer);
}
}
四、試題D——答案:65
問題描述
一個無向圖包含 2020 條邊,如果圖中沒有自環和重邊,請問最少包含多少個結點?
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
解法一:找規律(累加求和)
【答案】:65
【決議】:自環(Loop):若一條邊的兩個頂點為同一頂點,則此邊稱作自環,
題中所求的是“最少包含多少個結點”,64個節點最多包含2080條邊,63個節點最多包含2017條邊,
package simulationMatch_12_2021_2;
public class _04D {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 2019; i++) {
sum += i;
if (sum >= 2020) {
System.out.println(i);
break;
}
}
int sum64 = 0; // 65個節點
for (int i = 1; i <= 64; i++) {
sum64 += i;
}
System.out.println("65個節點-sum64:" + sum64);
int sum63 = 0; // 64個節點
for (int i = 1; i <= 63; i++) {
sum63 += i;
}
System.out.println("64個節點-sum63:" + sum63);
int sum62 = 0; // 63個節點
for (int i = 1; i <= 62; i++) {
sum62 += i;
}
System.out.println("63-個節點sum62:" + sum62);
}
}
五、試題E——答案:162
問題描述
兩個字母之間的距離定義為它們在字母表中位置的距離,例如 A 和 C 的距離為 2,L 和 Q 的距離為 5,
對于一個字串,我們稱字串中兩兩字符之間的距離之和為字串的內部距離,
例如:ZOO 的內部距離為 22,其中 Z 和 O 的距離為 11,
請問,LANQIAO 的內部距離是多少?答案提交
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
解法一:雙重for回圈遍歷所有組合
【答案】:162
【決議】:挨個遍歷,
![]()
![]()
![]()
![]()
package simulationMatch_12_2021_2;
public class _05E {
public static void main(String[] args) {
char arr1[] = "ZOO".toCharArray();
char arr2[] = "LANQIAO".toCharArray();
// System.out.println(arr1[0] - 'O');
// System.out.println(arr1[1] - 'A');
// System.out.println(arr1[2] - 'A');
solve(arr1);
System.out.println("--- --- ---");
solve(arr2);
}
public static void solve(char arr[]) {
int answer = 0;
for (int i = 0; i < arr.length - 1; i++) { // [0, 5]
for (int j = i + 1; j < arr.length; j++) {
System.out.println(arr[i] + "" + arr[j]);
answer += Math.abs((arr[i] - '0') - (arr[j] - '0'));
}
System.out.println("---");
}
System.out.println(answer);
}
}
六、試題F
問題描述
給定一個平行四邊形的底邊長度 l 和高度 h,求平行四邊形的面積,
輸入格式
輸入的第一行包含一個整數 l,表示平行四邊形的底邊長度,
第二行包含一個整數 h,表示平行四邊形的高,輸出格式
輸出一個整數,表示平行四邊形的面積,(提示:底邊長度和高都是整數的平行四邊形面積為整數)
樣例輸入
2
7樣例輸出
14
資料規模和約定
對于所有評測用例,1 <= l, h <= 100,
解法一:整數相乘
package simulationMatch_12_2021_2;
import java.util.Scanner;
public class _06F {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int l = sc.nextInt(); // 1 <= l, h <= 100
int h = sc.nextInt();
System.out.println(l * h);
}
}
七、試題G
問題描述
現在時間是 a 點 b 分,請問 t 分鐘后,是幾點幾分?
輸入格式
輸入的第一行包含一個整數 a,
第二行包含一個整數 b,
第三行包含一個整數 t,輸出格式
輸出第一行包含一個整數,表示結果是幾點,
第二行包含一個整數,表示結果是幾分,樣例輸入
3
20
165樣例輸出
6
5樣例輸入
3
20
175樣例輸出
6
15資料規模和約定
對于所有評測用例,0 <= a <= 23, 0 <= b <= 59, 0 <= t, t 分鐘后還是在當天,
解法一:整數運算
【決議】:先 初步 粗略地 更新 hour,然后 根據 minute的值 判斷 hour的值 是否 需要 繼續 更新,
package simulationMatch_12_2021_2;
import java.util.Scanner;
public class _07G {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int t = sc.nextInt();
int hour = a + t / 60;
int minute = b + t % 60;
if (minute >= 60) {
minute -= 60;
hour++;
}
System.out.println(hour);
System.out.println(minute);
}
}
解法二:計算增加的小時數
原文鏈接:Hand-design-藍橋杯第十二屆第二期模擬賽
package simulationMatch_12_2021_2;
import java.util.Scanner;
public class _07G2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int t = sc.nextInt();
int c, d, m;
d = (b + t) % 60; // 分鐘
m = (b + t) / 60; // 增加的小時數
c = a + m; // 小時
System.out.println(c);
System.out.println(d);
}
}
八、試題H
問題描述
小藍有一張黑白影像,由 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,
解法一
原文鏈接:咖啡果凍-藍橋杯第十二屆校內模擬賽(第二期)個人做題答案 僅供參考
package simulationMatch_12_2021_2;
import java.util.Scanner;
public class _08H {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] image = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
image[i][j] = in.nextInt();
}
}
int[][] newPicture = handle(image);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(newPicture[i][j] + " ");
}
System.out.println();
}
}
public static int[][] handle(int[][] image) {
int n = image.length;
if (n == 0) {
return null;
}
int m = image[0].length;
int[][] newPicture = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int sum = 0;
int count = 0;
for (int k = 0; k < 9; k++) { // 這個回圈用來遍歷以 (i,j)為中心的3*3的矩形里面的每個像素塊
int n_x = (i - 1) + k / 3; // 這里向下取整
int n_y = (j - 1) + k % 3;
if (isArea(n, m, n_x, n_y)) {
sum += image[n_x][n_y]; // 計算像素和
count++; // 計算像素個數
}
}
newPicture[i][j] = sum / count; // 向下取整
}
}
return newPicture;
}
public static boolean isArea(int row, int col, int i, int j) {
return i >= 0 && i < row && j >= 0 && j < col;
}
}
九、試題I
問題描述
小藍負責花園的灌溉作業,
花園可以看成一個 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,
解法一
原文鏈接:咖啡果凍-藍橋杯第十二屆校內模擬賽(第二期)個人做題答案 僅供參考
package simulationMatch_12_2021_2;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class _09I {
public static void main(String[] args) {
int[][] direction = { { -1, 0 }, { 0, -1 }, { 0, 1 }, { 1, 0 } };
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] garden = new int[n][m];
int tap = in.nextInt();
for (int i = 0; i < tap; i++) {
int r = in.nextInt();
int c = in.nextInt();
garden[r - 1][c - 1] = 1;
}
int time = in.nextInt();
int res = watering(garden, time, tap, direction);
System.out.println(res);
}
public static int watering(int[][] garden, int time, int tap, int[][] direction) { // 澆水
if (time <= 0) {
return tap;
}
int count = 0;
int n = garden.length;
int m = garden[0].length;
Queue<Node> q = new LinkedList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (garden[i][j] == 1) {
q.add(new Node(i, j));
}
}
}
while (time > 0) {
int size = q.size();
for (int i = 0; i < size; i++) {
Node temp = q.poll();
int x = temp.row;
int y = temp.col;
for (int j = 0; j < 4; j++) {
int n_x = x + direction[j][0];
int n_y = y + direction[j][1];
if (isArea(n, m, n_x, n_y)) {
garden[n_x][n_y] = 1;
q.offer(new Node(n_x, n_y));
}
}
}
time--;
}
for (int i = 0; i < n; i++) {// 澆完水之后再統計數量
for (int j = 0; j < m; j++) {
if (garden[i][j] == 1) {
count++;
}
}
}
return count;
}
public static boolean isArea(int row, int col, int x, int y) {
return 0 <= x && x < row && y >= 0 && y < col;
}
}
class Node { // 這個類用來表示一個點 有row 和 col 表示坐標
int row;
int col;
public Node(int row, int col) {
this.row = row;
this.col = col;
}
}
十、試題J
問題描述
小藍在一個 n 行 m 列的方格圖中玩一個游戲,
開始時,小藍站在方格圖的左上角,即第 1 行第 1 列,
小藍可以在方格圖上走動,走動時,如果當前在第 r 行第 c 列,他不能走到行號比 r 小的行,也不能走到列號比 c 小的列,同時,他一步走的直線距離不超過3,
例如,如果當前小藍在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列、第 5 行第 6 列、第 6 行第 5 列之一,
小藍最終要走到第 n 行第 m 列,
在圖中,有的位置有獎勵,走上去即可獲得,有的位置有懲罰,走上去就要接受懲罰,獎勵和懲罰最終抽象成一個權值,獎勵為正,懲罰為負,
小藍希望,從第 1 行第 1 列走到第 n 行第 m 列后,總的權值和最大,請問最大是多少?輸入格式
輸入的第一行包含兩個整數 n, m,表示圖的大小,
接下來 n 行,每行 m 個整數,表示方格圖中每個點的權值,輸出格式
輸出一個整數,表示最大權值和,
樣例輸入
3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4樣例輸出
15
資料規模和約定
對于30%的評測用例,1 <= n, m <= 10;
對于50%的評測用例,1 <= n, m <= 20;
對于所有評測用例,1 <= n <= 100,-10000 <= 權值 <= 10000,
解法一
原文鏈接:咖啡果凍-藍橋杯第十二屆校內模擬賽(第二期)個人做題答案 僅供參考
package simulationMatch_12_2021_2;
import java.util.Scanner;
import java.util.Arrays;
public class _10J {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] map = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = in.nextInt();
}
}
int res = getMaxPath(map);
System.out.println(res);
}
public static int getMaxPath(int[][] map) {
int n = map.length;
int m = map[0].length;
int[][] dp = new int[n][m];
for (int i = 0; i < n; i++) {
Arrays.fill(dp[i], Integer.MIN_VALUE);
}
dp[0][0] = map[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int step = 1; step <= 3; step++) {// 三種狀態到達該點 走1 2 3 步
for (int right = 0; right <= step; right++) {
int down = step - right;
int n_x = i - down;
int n_y = j - right;
if (isArea(n, m, n_x, n_y)) {
dp[i][j] = Math.max(dp[i][j], map[i][j] + dp[n_x][n_y]);
}
}
}
}
}
return dp[n - 1][m - 1];
}
public static boolean isArea(int row, int col, int x, int y) {
return 0 <= x && x < row && y >= 0 && y < col;
}
}
小結
- 簡單題,拿滿分;
- 難題,盡量拿分,
我昨天中午才考完試(2020年1月13日 12:20),今天(2020年1月14日)下午寫的,
2021年 第12屆 藍橋杯 第1次模擬賽真題詳解及小結,有網友期待第2期,謝謝大家,祝大家藍橋杯得好獎!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248517.html
標籤:其他
上一篇:Problem I: 挖寶游戲



















