2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】
- 藍橋杯 Java B組 省賽真題詳解及小結匯總【2013年(第4屆)~2020年(第11屆)】
- 注意:部分代碼及程序 源自 藍橋杯 官網視頻(歷年真題解析)?鄭未老師。
- 第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】
? ??
一、試題 A: 指數計算
本題總分:5 分
【問題描述】
7 月 1 日是建黨日,從 1921 年到 2020 年,中國共產黨已經帶領中國人民 走過了 99 年。
請計算:?mod 1921,其中 A mod B 表示 A 除以 B 的余數。
【答案提交】
這是一道結果填空題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
【答案】:480
解法一:使用“計算器”求解
? ??
解法二:大整數BigInteger
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。下表給出了字符變換的規則:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
例如,將字符串 YeRi 加密可得字符串 EaFn。
小明有一個隨機的字符串,加密后為
EaFnjISplhFviDhwFbEjRjfIBBkRyY
(由 30 個大小寫英文字母組成,不包含換行符),請問原字符串是多少?
(如果你把以上字符串和表格復制到文本文件中,請務必檢查復制的內容是否與文檔中的一致。在試題目錄下有一個文件 str.txt,第一行為上面的字符串,后面 52 行依次為表格中的內容。)
【答案提交】
這是一道結果填空題,你只需要算出結果后提交即可。本題的結果為一個只包含 30 個大小寫英文字母的字符串,在提交答案時只填寫這個字符串,填寫多余的內容將無法得分。
【答案】:YeRikGSunlRzgDlvRwYkXkrGWWhXaA
解法一:手工計算
【解析】:觀察表可得:a->y、A->Y;建議:5個字母 5個字母地一一進行對比。
解法二:編程計算 indexOf()+substring()
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
解法一:代碼+手工計算
跑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);}}解法二:純代碼
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】
【答案】:403
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。
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分)
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改進
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分)
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,位運算相對快一些}}}解法二:快速位運算改進
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
【樣例輸出】
0
【評測用例規模與約定】
對于所有評測用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
解法一:dp
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]);}}解法二
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]);}}解法三
原文地址
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
原文地址
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。
? ?ASCII碼表
解法一(有誤!!!)
注意:此題解有誤!!!部分樣例不過關!!!請看題解二!!!
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);} */解法二
原文鏈接
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) {// 不為0if (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,因為字母的大小不能超過26if (num[i + 1] <= '6') {// 看第i+2位是否存在if (i < len - 2) {// 看第i+2位是否=0if (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。
注意超時!!!
其他解法?
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這種上界!!!
總結
以上是生活随笔為你收集整理的2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年 第11届 蓝桥杯 C/C++
- 下一篇: Java22-day13【Lambda表