天天看點

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

  • 藍橋杯 Java B組 省賽真題詳解及小結彙總【2013年(第4屆)~2020年(第11屆)】
  • 注意:部分代碼及程式 源自 藍橋杯 官網視訊(曆年真題解析) 鄭未老師。
  1. 2013年 第04屆 藍橋杯 Java B組 省賽真題詳解及小結
  2. 2014年 第05屆 藍橋杯 Java B組 省賽真題詳解及小結
  3. 2015年 第06屆 藍橋杯 Java B組 省賽真題詳解及小結
  4. 2016年 第07屆 藍橋杯 Java B組 省賽真題詳解及小結
  5. 2017年 第08屆 藍橋杯 Java B組 省賽真題詳解及小結
  6. 2018年 第09屆 藍橋杯 Java B組 省賽真題詳解及小結
  7. 2019年 第10屆 藍橋杯 Java B組 省賽真題詳解及小結
  8. 2020年 第11屆 藍橋杯 第1次模拟賽真題詳解及小結(校内模拟)【Java版】
  9. 2020年 第11屆 藍橋杯 第2次模拟賽真題詳解及小結【Java版】
  10. 2020年 第11屆 藍橋杯 C/C++ B組 省賽真題詳解及小結【第1場省賽 2020.7.5】【Java版】
  11. 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2020.7.5】
  12. 2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】
  • 第11屆 藍橋杯-第1、2次模拟(軟體類)真題-(2020年3月、4月)-官方講解視訊

目   錄

一、試題 A: 指數計算

解法一:使用“電腦”求解

解法二:大整數BigInteger

二、試題 B: 解密

解法一:手工計算

解法二:程式設計計算 indexOf()+substring()

三、試題 C: 跑步訓練

解法一:代碼+手工計算

解法二:純代碼

四、試題 D: 合并檢測

解法一

解法二

五、試題 E: REPEAT 程式

六、試題 F: 分類計數

七、試題 G: 整除序列

解法一:ArrayList(80分)

解法一:ArrayList改進

解法二:快速位運算(80分)

解法二:快速位運算改進

八、試題 H: 走方格

解法一:dp

解法二

解法三

解法四:dfs

九、試題 I: 字元串編碼

解法一(有誤!!!)

解法二

十、試題 J: 整數小拼接

小結

試題下載下傳:【連結:https://pan.baidu.com/s/1fQF12Oc-8ndZfXtmWrC26w   提取碼:zjxs】
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

一、試題 A: 指數計算

本題總分:5 分

【問題描述】

7 月 1 日是建黨日,從 1921 年到 2020 年,中國共産黨已經帶領中國人民 走過了 99 年。

請計算:

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

 mod 1921,其中 A mod B 表示 A 除以 B 的餘數。

【答案送出】

這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。

【答案】:480

解法一:使用“電腦”求解

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

解法二:大整數BigInteger

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.math.BigInteger;

public class _01_指數計算 {

	public static void main(String[] args) {
		BigInteger a = new BigInteger("7");
		BigInteger MOD = new BigInteger("1921");
		a = a.pow(2020);
		BigInteger b = a.mod(MOD);
		System.out.println(b);
		System.out.println(new BigInteger("7").pow(2020).mod(MOD));
		System.out.println(new BigInteger("7").pow(2020).remainder(MOD));//大整數取模
	}

}
           

二、試題 B: 解密

本題總分:5 分

【問題描述】

小明設計了一種文章加密的方法:對于每個字母 c,将它變成某個另外的字元 Tc。下表給出了字元變換的規則:

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

例如,将字元串 YeRi 加密可得字元串 EaFn。

小明有一個随機的字元串,加密後為

EaFnjISplhFviDhwFbEjRjfIBBkRyY

(由 30 個大小寫英文字母組成,不包含換行符),請問原字元串是多少?

(如果你把以上字元串和表格複制到文本檔案中,請務必檢查複制的内容是否與文檔中的一緻。在試題目錄下有一個檔案 str.txt,第一行為上面的字元串,後面 52 行依次為表格中的内容。)

【答案送出】

這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個隻包含 30 個大小寫英文字母的字元串,在送出答案時隻填寫這個字元串,填寫多餘的内容将無法得分。

【答案】:YeRikGSunlRzgDlvRwYkXkrGWWhXaA

解法一:手工計算

【解析】:觀察表可得:a->y、A->Y;建議:5個字母 5個字母地一一進行對比。
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

解法二:程式設計計算 indexOf()+substring()

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

public class _02_解密 {
	public static void main(String[] args) { // 30個字元
//		String res = "YeRik GSunl RzgDl vRwYk XkrGW WhXaA"; // 未加密【答案】
//		String str = "EaFnj ISplh FviDh wFbEj RjfIB BkRyY"; // 加密後
		String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY"; // 加密後的字元
		char[] arr = str.toCharArray();
		String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 原字元
		String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV"; // 加密後的字元
		String s3 = ""; // 解密後的字元
		for (int i = 0; i < arr.length; i++) {
			int j = s2.indexOf(arr[i]);   // 輸出目前字元在加密後字元中的位置
			s3 += s1.substring(j, j + 1); // 找出原字元在此位置對應的字元
		}
		System.out.println(s3);
	}
}
           

三、試題 C: 跑步訓練

本題總分:10 分

【問題描述】

小明要做一個跑步訓練。

初始時,小明充滿體力,體力值計為 10000。如果小明跑步,每分鐘損耗 600 的體力。如果小明休息,每分鐘增加 300 的體力。體力的損耗和增加都是均勻變化的。

小明打算跑一分鐘、休息一分鐘、再跑一分鐘、再休息一分鐘……如此循 環。如果某個時刻小明的體力到達 0,他就停止鍛煉。 請問小明在多久後停止鍛煉。為了使答案為整數,請以秒為機關輸出答案。 答案中隻填寫數,不填寫機關。 【答案送出】 這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個 整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。

【答案】:3880

解法一:代碼+手工計算

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結

跑31分鐘後,還剩700體力。再跑一分鐘後,還剩100體力;休息1分鐘,還剩400體力。

此時,一共跑了32分鐘、剩400體力。即:32*2*60+40

package provincialGames_11_2020_1_C;

public class _01_跑步訓練 {

	public static void main(String[] args) {
		int count = 0;
		for (int i = 10000; i >= 0; i -= 300) {
			System.out.println(count++ + " : " + i);
		}
		System.out.println("31 * 2 * 60: " + 31 * 2 * 60);
		System.out.println("32 * 2 * 60: " + 32 * 2 * 60);
	}

}
           

解法二:純代碼

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

public class _01_跑步訓練2 {
	public static void main(String[] args) {
		int target = 10000;
		int count = 0;
		boolean flag = true;
		while (true) {
			// 如果小于600體力并且需要跑步,證明這一分鐘跑不完
			if (target < 600 && flag) {
				break;
			}
			if (flag) {
				target -= 600;
				flag = false;
			} else {
				target += 300;
				flag = true;
			}
			count++;
		}
//        System.out.println(count);
		// 最後要求秒數,一分鐘花費600體力,一秒花費10體力,體力除10就是剩下的跑步時間
		int time = count * 60 + target / 10;
		System.out.println(time);
	}
}
           

四、試題 D: 合并檢測

本題總分:10 分

【問題描述】

新冠疫情由新冠病毒引起,最近在 A 國蔓延,為了盡快控制疫情,A 國準備給大量群眾進病毒核酸檢測。

然而,用于檢測的試劑盒緊缺。

為了解決這一困難,科學家想了一個辦法:合并檢測。即将從多個人(k 個)采集的标本放到同一個試劑盒中進行檢測。如果結果為陰性,則說明這 k 個人都是陰性,用一個試劑盒完成了 k 個人的檢測。如果結果為陽性,則說明至少有一個人為陽性,需要将這 k 個人的樣本全部重新獨立檢測(從理論上看,如果檢測前 k − 1 個人都是陰性可以推斷出第 k 個人是陽性,但是在實際操作中不會利用此推斷,而是将 k 個人獨立檢測),加上最開始的合并檢測,一共使用了 k + 1 個試劑盒完成了 k 個人的檢測。

A 國估計被測的群眾的感染率大概是 1%,呈均勻分布。請問 k 取多少能最節省試劑盒?

【答案送出】

這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個 整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。

【答案】:10

解法一

這題數學問題

設總人數為pop,感染率p,每次k人,總市級數sum

sum = ( [pop / k]+1 ) * ( 1+k*p(k+1) )

這裡的[ pop / k ] + 1,即pop/k向上取整

[pop/k] + 1 這裡由于pop數量較大,是以這裡向上取整的1可以忽略,這裡直接取了pop/k,即

sum = ( pop / k ) * ( 1 + kp( k+1 ) )

将p代入sum = (pop/k)*( 1+k*0.01( k+1 ) )

sum求導 = ( pop/k ) ( 0.01k-1/k)

可得當k =10時,sum取最小值

是以K = 10。

解法二

原文連結

假設A國有n個人,感染者有n/100

每k個人一組,共n/k組,共用n/k瓶試劑

按照最壞的情況,每多出一個感染者就多用k瓶試劑,

是以共用n/k+(n/100)*k瓶試劑

n是定值,是以求(1/k+k/100)最小

由于a+b>=2√ab

當且僅當a = b時,取等号

即1/k=k/100時,取得最小值

解得k = 10

五、試題 E: REPEAT 程式

本題總分:10 分

【問題描述】

附件 prog.txt 中是一個用某種語言寫的程式。

其中 REPEAT k 表示一個次數為 k 的循環。循環控制的範圍由縮進表達,從次行開始連續的縮進比該行多的(前面的空白更長的)為循環包含的内容。

例如如下片段:

REPEAT 2:

A = A + 4

REPEAT 5:

        REPEAT 6:

                A = A + 5

        A = A + 7

A = A + 8

A = A + 9

該片段中從 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循環兩次中。

REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循環中。

A = A + 5 實際總共的循環次數是 2 × 5 × 6 = 60 次。

請問該程式執行完畢之後,A 的值是多少?

【答案送出】

這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。

prog.txt:内容太多。。。不展示了。。。

題目下載下傳:【連結:https://pan.baidu.com/s/1XgZWE-3sxD7lw0-dhMnPHg   提取碼:zjxs】

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
【答案】:403
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

public class _04_REPEAT程式 {

	public static void main(String[] args) {
		int a = 0, count = 1;
		for (int i = 1; i <= 2; i++) {
			a = a + 4;
			for (int j = 1; j <= 5; j++) {
				for (int k = 1; k <= 6; k++) {
					a = a + 5;
					System.out.println("第" + count++ + "次循環:" + a);
				}
				a = a + 7;
			}
			a = a + 8;
		}
		a = a + 9;
		System.out.println(a);
		System.out.println(count);
	}

}
           

六、試題 F: 分類計數

時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:15 分

【問題描述】

輸入一個字元串,請輸出這個字元串包含多少個大寫字母,多少個小寫字母,多少個數字。

【輸入格式】

輸入一行包含一個字元串。

【輸出格式】

輸出三行,每行一個整數,分别表示大寫字母、小寫字母和數字的個數。

【樣例輸入】

1+a=Aab

【樣例輸出】

1 3 1

【評測用例規模與約定】

對于所有評測用例,字元串由可見字元組成,長度不超過 100。

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _06_分類計數 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		char[] temp = str.toCharArray();
		int upper = 0, lower = 0, digit = 0;
		for (int i = 0; i < temp.length; i++) {
			if ('A' <= temp[i] && temp[i] <= 'Z') {
				upper++;
			} else if ('a' <= temp[i] && temp[i] <= 'z') {
				lower++;
			} else if ('0' <= temp[i] && temp[i] <= '9') {
				digit++;
			}
		}
		System.out.println(upper + " " + lower + " " + digit);
	}

}
           

七、試題 G: 整除序列

時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:15 分

【問題描述】

有一個序列,序列的第一個數是 n,後面的每個數是前一個數整除 2,請輸出這個序列中值為正數的項。

【輸入格式】

輸入一行包含一個整數 n。

【輸出格式】

輸出一行,包含多個整數,相鄰的整數之間用一個空格分隔,表示答案。

【樣例輸入】

20

【樣例輸出】

20 10 5 2 1

【評測用例規模與約定】

對于 80% 的評測用例,1 ≤ n ≤ 10^9。

對于所有評測用例,1 ≤ n ≤ 10^18。

解法一:ArrayList(80分)

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.ArrayList;
import java.util.Scanner;

public class _06_整除序列 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(n);
		while (n / 2 > 0) {
			list.add(n / 2);
			n /= 2;
		}
		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 1) {
				System.out.print(list.get(i) + " ");
			} else {
				System.out.print(list.get(i));
			}
		}
	}

}
           

解法一:ArrayList改進

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_CC;

import java.util.ArrayList;
import java.util.Scanner;

public class _06_整除序列_改進 { // 注意逾時!!!

	public static void main(String[] args) {
		System.out.println(Integer.MAX_VALUE);
		System.out.println(Long.MAX_VALUE);
		Scanner sc = new Scanner(System.in);
		Long n = sc.nextLong();
		ArrayList<Long> list = new ArrayList<Long>();
		list.add(n);
		while (n / 2 > 0) {
			list.add(n / 2);
			n /= 2;
		}
		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 1) {
				System.out.print(list.get(i) + " ");
			} else {
				System.out.print(list.get(i));
			}
		}
	}

}
           

解法二:快速位運算(80分)

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _06_整除序列2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		while (n != 0) {
			System.out.print(n + " ");
			n = n >> 1; // 等價于/2,位運算相對快一些
		}
	}

}
           

解法二:快速位運算改進

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_CC;

import java.util.Scanner;

public class _06_整除序列2_改進 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Long n = sc.nextLong();
		sc.close();
		while (n != 0) {
			System.out.print(n + " ");
			n = n >> 1; // 等價于/2,位運算相對快一些
		}
	}

}
           

八、試題 H: 走方格

時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:20 分

【問題描述】

在平面上有一些二維的點陣。 這些點的編号就像二維數組的編号一樣,從上到下依次為第 1 至第 n 行,從左到右依次為第 1 至第 m 列,每一個點可以用行号和列号來表示。

現在有個人站在第 1 行第 1 列,要走到第 n 行第 m 列。隻能向右或者向下走。

注意,如果行号和列數都是偶數,不能走入這一格中。

問有多少種方案。

【輸入格式】

輸入一行包含兩個整數 n, m。

【輸出格式】

輸出一個整數,表示答案。

【樣例輸入】

3 4

【樣例輸出】

2

【樣例輸入】

6 6

【樣例輸出】

【評測用例規模與約定】

對于所有評測用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。

解法一:dp

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _08_走方格 {

	public static void main(String[] args) {
		// 輸入矩陣的寬高
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		sc.close();
		int[][] dp = new int[n][m];
		dp[0][0] = 1;
		// 這個規律是隻能往右下走,也就是隻能取左上的值
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				// 第一行一列無需處理
				if (i == 0 && j == 0) {
					continue;
				}
				// 隻要不是第一行就可以取上面的
				if (i > 0) {
					dp[i][j] += dp[i - 1][j];
				}
				// 隻要不是第一列就可以取左面的
				if (j > 0) {
					dp[i][j] += dp[i][j - 1];
				}
				// 如果是偶數行列不能取值,這裡是奇數,因為我的是從0開始,是以偶數的就變成了奇數
				if ((i & 1) == 1 && (j & 1) == 1) {
					dp[i][j] = 0;
				}
			}
		}
		System.out.println(dp[n - 1][m - 1]);
	}

}
           

解法二

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_CC;

import java.util.Scanner;

public class _08_走方格2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[][] grid = new int[n][m];
		for (int i = 0; i < n; i++) {
			grid[i][0] = 1;
		}
		for (int i = 0; i < m; i++) {
			grid[0][i] = 1;
		}
		for (int i = 1; i < n; i++) {
			for (int j = 1; j < m; j++) {
				if (i % 2 == 1 && j % 2 == 1) {
					continue;
				}
				grid[i][j] = grid[i - 1][j] + grid[i][j - 1];
			}
		}
		System.out.println(grid[n - 1][m - 1]);
	}

}
           

解法三

原文位址
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _08_走方格3 {

	static int n, m, count = 0;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		f(1, 1);
		System.out.println(count);
	}

	private static void f(int n1, int m1) {
		if (n1 == n && m1 == m) {
			count++;
			return;
		}
		if (n1 > n || m1 > m)
			return;
		int[][] arr = { { 0, 1 }, { 1, 0 } };
		for (int i = 0; i < 2; i++) {
			int x1 = n1 + arr[i][0];
			int y1 = m1 + arr[i][1];

			if (x1 % 2 == 0 && y1 % 2 == 0)
				continue;
			f(x1, y1);
		}
		return;
	}

}
           

解法四:dfs

原文位址
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _08_走方格4 {

	static long[][] dp;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n = scanner.nextInt();
			int m = scanner.nextInt();
			dp = new long[n + 1][m + 1];
			for (int i = 1; i <= n; i++) {
				for (int j = 1; j <= m; j++) {
					dp[i][j] = -1;
				}
			}
			long res = dfs(1, 1, n, m);
			System.out.println(res);
		}
	}

	private static long dfs(int x, int y, int n, int m) {
		if (x <= 0 || x > n || y <= 0 || y > m || (x % 2 == 0 && y % 2 == 0)) {
			return 0;
		}
		if (dp[x][y] != -1) {
			return dp[x][y];
		}
		if (x == n && y == m) {
			return 1;
		}
		dp[x][y] = dfs(x + 1, y, n, m) + dfs(x, y + 1, n, m);
		return dp[x][y];
	}

}
           

九、試題 I: 字元串編碼

時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分

【問題描述】

小明發明了一種給由全大寫字母組成的字元串編碼的方法。對于每一個大寫字母,小明将它轉換成它在 26 個英文字母中序号,即 A → 1, B → 2, ... Z → 26。

這樣一個字元串就能被轉化成一個數字序列:

比如 ABCXYZ → 123242526。

現在給定一個轉換後的數字序列,小明想還原出原本的字元串。當然這樣的還原有可能存在多個符合條件的字元串。小明希望找出其中字典序最大的字元串。

【輸入格式】

一個數字序列。

【輸出格式】

一個隻包含大寫字母的字元串,代表答案。

【樣例輸入】

123242526

【樣例輸出】

LCXYZ

【評測用例規模與約定】

對于 20% 的評測用例,輸入的長度不超過 20。

對于所有評測用例,輸入的長度不超過 200000。

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
   ASCII碼表

解法一(有誤!!!)

2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
注意:此題解有誤!!!部分樣例不過關!!!請看題解二!!!
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

public class _09_字元串編碼2 { // 123242526 -> LCXYZ 【部分樣例不過關!】

	public static void main(String[] args) {
		java.util.Scanner sc = new java.util.Scanner(System.in);
		String s = sc.nextLine();
		char c[] = s.toCharArray();
		String b = "";
		for (int i = 0; i < c.length - 1;) {
			int temp = (c[i] - '0') * 10 + (c[i + 1] - '0');
			if (temp <= 26) {
				b += ((char) ((temp - 1) + 'A'));
				c[i] = '0';
				c[i + 1] = '0';
				i += 2;
			} else {
				b += ((char) ((temp / 10 - 1) + 'A'));
				i++;
			}
		}
		if (c[c.length - 1] != '0') {
			s += c[c.length - 1];
		}
		System.out.println(b);
	}

}
/**
// c[c.length - 1]:字元數組的倒數第1個字元
// c[c.length - 2]:字元數組的倒數第2個字元
// c[c.length - 3]:字元數組的倒數第3個字元

	public static void main(String[] args) {
		java.util.Scanner sc = new java.util.Scanner(System.in);
		String s = sc.nextLine();
		char c[] = s.toCharArray();
		String b = "";
		for (int i = 0; i < c.length - 1;) { // 周遊字元數組(最後一個字元并未周遊,防止數組越界!)
			int temp = (c[i] - '0') * 10 + (c[i + 1] - '0'); // 字元轉數字
			if (temp <= 26) {
				b += ((char) ((temp - 1) + 'A')); // 将數字轉化為對應的字元
				i += 2;
//				c[i] = '0';
//				if (i != c.length - 2) { // 如果字元c[i+1]是字元數組的最後一個字元
//				}
//				c[i + 1] = '0';
			} else {
				b += ((char) ((temp / 10 - 1) + 'A')); // 将數字轉化為對應的字元
				i++;
			}
		}
		if (c.length >= 3) { // 符合此條件,則字元數組的最後一個字元一定需要轉化為字母
			int temp23 = (c[c.length - 3] - '0') * 10 + (c[c.length - 2] - '0'); // 倒數第2、3個字元合并
			int temp12 = (c[c.length - 2] - '0') * 10 + (c[c.length - 1] - '0'); // 倒數第1、2個字元合并
			if (temp23 >= 26) {
				b += ((char) ((temp23 - 1) + 'A')); // 将數字轉化為對應的字元
			}
		}
		System.out.println(b);
	}
*/
           

解法二

原文連結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _09_字元串編碼 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		sc.close();
		StringBuilder sb = new StringBuilder();

		int len = s.length();
		char[] num = s.toCharArray();
		for (int i = 0; i < len; i++) {
			// 1開頭
			if (num[i] == '1') {
				// 第i+2位是否為0,如果為0,目前位就不能和i+1位合并成一個字母
				if (i < len - 2) {
					// 不為0
					if (num[i + 2] != '0') {
//                        System.out.println((num[i]-'0') * 10 + num[i + 1] + 'A' -1 -'0' );
						sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
						++i;
						// 為0,目前位就不能和i+1位合并成一個字母,(如果合成字母,剩下一個0沒辦法轉換)
					} else {
						sb.append((char) (num[i] - '0' + 'A' - 1));
					}
					// i+2已超過盡頭
				} else {
					// 看i+1位是否存在
					if (i < len - 1) {

						sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
						// 不存在,第i位為最後一位
					} else {
						sb.append((char) (num[i] - '0' + 'A' - 1));
					}
					break;
				}
				// 2開頭
			} else if (num[i] == '2') {
				// 看存不存在下一位
				if (i < len - 1) {
					// 看下一位是不是小于6,因為字母的大小不能超過26
					if (num[i + 1] <= '6') {
						// 看第i+2位是否存在
						if (i < len - 2) {
							// 看第i+2位是否=0
							if (num[i + 2] != '0') {
								sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
								++i;
								// 為0,目前位就不能和i+1位合并成一個字母,(如果合成字母,剩下一個0沒辦法轉換)
							} else {
								sb.append((char) (num[i] - '0' + 'A' - 1));
							}
							// 不存在的話,就直接添加就行
						} else {
							sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
							break;
						}
						// 如果大于6,證明不能和後一位合并
					} else {
						sb.append((char) (num[i] - '0' + 'A' - 1));
					}
					// 不存在下一位,這一位就直接放進去
				} else {
					sb.append((char) (num[i] - '0' + 'A' - 1));
				}
				// 如果大于2的話,就直接添加就行,字母沒有2以上開頭的
			} else {
				sb.append((char) (num[i] - '0' + 'A' - 1));
			}
		}
		System.out.println(sb.toString());
	}

	public static char getUppLetter(int num) {
		System.out.println((char) (num));
		return (char) (num);
	}

}
           

十、試題 J: 整數小拼接

時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分

【問題描述】

給定一個長度為 n 的數組 A1, A2, · · · , An。你可以從中選出兩個數 Ai 和 Aj (i 不等于 j),然後将 Ai 和 Aj 一前一後拼成一個新的整數。例如 12 和 345 可以拼成 12345 或 34512 。注意交換 Ai 和 Aj 的順序總是被視為 2 種拼法,即便是 Ai = Aj 時。

請你計算有多少種拼法滿足拼出的整數小于等于 K。

【輸入格式】

第一行包含 2 個整數 n 和 K。

第二行包含 n 個整數 A1, A2, · · · , An。

【輸出格式】 一個整數代表答案。

【樣例輸入】

4 33

1 2 3 4

【樣例輸出】

8

【評測用例規模與約定】

對于 30% 的評測用例,1 ≤ N ≤ 1000, 1 ≤ K ≤ 10^8 , 1 ≤ Ai ≤ 10^4。

對于所有評測用例,1 ≤ N ≤ 100000,1 ≤ K ≤ 10^10,1 ≤ Ai ≤ 10^9。

注意逾時!!!
2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】一、試題 A: 指數計算二、試題 B: 解密三、試題 C: 跑步訓練四、試題 D: 合并檢測五、試題 E: REPEAT 程式六、試題 F: 分類計數七、試題 G: 整除序列八、試題 H: 走方格九、試題 I: 字元串編碼十、試題 J: 整數小拼接小結
其他解法 
package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _10_整數小拼接 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int[] array = new int[n];
		for (int i = 0; i < n; i++) {
			array[i] = sc.nextInt();
		}
		int answer = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				String temp = array[i] + "" + array[j];
				Integer sum = Integer.valueOf(temp);
				if (i != j && sum <= k) {
					answer++;
				}
			}
		}
		System.out.println(answer);
	}

}
           

小結

寫題的時候,一定要注意資料的上界與下界!尤其是:10^9、10^18這種上界!!!