藍橋杯 2020 年省賽真題(Java 大學 B 組 )
我是C組的,不過對比一下題目錄,大體上也只有三兩題的不一樣java
就過程而言我以爲我是爆炸的,固然,就結果而言也是算法
先掛,自閉會學習
#A 門牌製做
本題總分:5 分測試
問題描述spa
小藍要爲一條街的住戶製做門牌號。
這條街一共有 2020 位住戶,門牌號從 1 到 2020 編號。
小藍製做門牌的方法是先製做 0 到 9 這幾個數字字符,最後根據須要將字
符粘貼到門牌上,例如門牌 1017 須要依次粘貼字符 一、0、一、7,即須要 1 個
字符 0,2 個字符 1,1 個字符 7。
請問要製做全部的 1 到 2020 號門牌,總共須要多少個字符 2?
設計
答案提交code
這是一道結果填空的題,你只須要算出結果後提交便可。本題的結果爲一
個整數,在提交答案時只填寫這個整數,填寫多餘的內容將沒法得分。
blog
624排序
calcCode:遊戲
public class Test { public static void main(String[] args) { int cnt = 0; for (int i = 1, n = 1; i <= 2020; n = ++i) do if (n % 10 == 2) cnt++; while((n /= 10) > 0); System.out.print(cnt); } }
回看過來,這題也太幸福了8
#B 尋找 2020
本題總分:5 分
問題描述
小藍有一個數字矩陣,裏面只包含數字 0 和 2。小藍很喜歡 2020,他想找
到這個數字矩陣中有多少個 2020 。
小藍只關注三種構成 2020 的方式:
- 同一行裏面連續四個字符從左到右構成 2020。
- 同一列裏面連續四個字符從上到下構成 2020。
- 在一條從左上到右下的斜線上連續四個字符,從左上到右下構成 2020。
例如,對於下面的矩陣:
220000 000000 002202 000000 000022 002020
一共有 5 個 2020。其中 1 個是在同一行裏的,1 個是在同一列裏的,3 個
是斜線上的。
小藍的矩陣比上面的矩陣要大,因爲太大了,他只好將這個矩陣放在了一
個文件裏面,在試題目錄下有一個文件 2020.txt,裏面給出了小藍的矩陣。
請幫助小藍肯定在他的矩陣中有多少個 2020。
答案提交
這是一道結果填空題,你只須要算出結果後提交便可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將沒法得分。
16520
calcCode:
首先肯定一下矩陣大小
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("2020.txt"))); System.out.println(in.readLine().length());
動手
import java.io.*; public class Test { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("2020.txt"))); int[] ioffset = { 0, 1, 1 }; int[] joffset = { 1, 0, 1 }; char[] word = { '2', '0', '2', '0' }; char[][] map = new char[300][]; for (int i = 0; i < 300; i++) map[i] = in.readLine().toCharArray(); int cnt = 0; for (int n = 0; n < 300; n++) for (int m = 0; m < 300; m++) for (int k = 0; k < 3; k++) { int temp = 0; for (int i = n, j = m, step = 0; i >= 0 && i < 300 && j >= 0 && j < 300 && step < 4; i += ioffset[k], j += joffset[k], step++) if (map[i][j] == word[step]) temp++; if (temp == 4) cnt++; } System.out.print(cnt); } }
#C 蛇形填數
本題總分:10 分
問題描述
以下圖所示,小明用從 1 開始的正整數「蛇形」填充無限大的矩陣。
1 2 6 7 15 ... 3 5 8 14 ... 4 9 13 ... 10 12 ... 11 ... ...
容易看出矩陣第二行第二列中的數是 5。請你計算矩陣中第 20 行第 20 列
的數是多少?
答案提交
這是一道結果填空題,你只須要算出結果後提交便可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將沒法得分。
761
calcCode:
public class Test { public static void main(String[] args) { int[][] map = new int[201][201]; int n = 0; for (int k = 1; k <= 200; k++) for (int i = 1; i <= k; i++) map[i][k - i + 1] = ++n; System.out.print(map[20][20]); } }
憑啥啊,B組比C組簡單這麼多
螞蟻競走十年了,小明已經跑了二十年了
#D 七段碼
本題總分:10 分
問題描述
小藍要用七段碼數碼管來表示一種特殊的文字。
上圖給出了七段碼數碼管的一個圖示,數碼管中一共有 7 段能夠發光的二
極管,分別標記爲 a, b, c, d, e, f, g。
小藍要選擇一部分二極管(至少要有一個)發光來表達字符。在設計字符
的表達時,要求全部發光的二極管是連成一片的。
例如:b 發光,其餘二極管不發光能夠用來表達一種字符。
例如:c 發光,其餘二極管不發光能夠用來表達一種字符。這種方案與上
一行的方案能夠用來表示不一樣的字符,儘管看上去比較類似。
例如:a, b, c, d, e 發光,f, g 不發光能夠用來表達一種字符。
例如:b, f 發光,其餘二極管不發光則不能用來表達一種字符,由於發光
的二極管沒有連成一片。
請問,小藍能夠用七段碼數碼管表達多少種不一樣的字符?
答案提交
這是一道結果填空題,你只須要算出結果後提交便可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將沒法得分。
80
calcCode:
import java.util.Arrays; public class Test { static int cnt; static boolean[] select, marked, graph[]; public static void main(String[] args) { // 0: a, 1: b, 2: c, 3: d, 4: e, 5: f, 6: g select = new boolean[7]; marked = new boolean[7]; graph = new boolean[7][7]; graph[0][1] = graph[1][0] = true; graph[0][5] = graph[5][0] = true; graph[1][6] = graph[6][1] = true; graph[1][2] = graph[2][1] = true; graph[2][6] = graph[6][2] = true; graph[2][3] = graph[3][2] = true; graph[3][4] = graph[4][3] = true; graph[4][5] = graph[5][4] = true; graph[4][6] = graph[6][4] = true; graph[5][6] = graph[6][5] = true; dfs(0, 0); System.out.print(cnt); } static void dfs(int d, int len) { if (d == 7) { if (len == 0) return; int v = 0; while (!select[v]) v++; Arrays.fill(marked, false); if (findPath(v) == len) cnt++; } else { select[d] = true; dfs(d + 1, len + 1); select[d] = false; dfs(d + 1, len); } } static int findPath(int v) { marked[v] = true; int len = 1; for (int w = 0; w < 7; w++) { if (!select[w] || marked[w] || !graph[v][w]) continue; len += findPath(w); } return len; } }
由於這個圖存在環,因此不能正常回溯,但全排列下來也只有 127 種組合,索性就不回溯了
#E 排序
本題總分:15 分
問題描述
小藍最近學習了一些排序算法,其中冒泡排序讓他印象深入。
在冒泡排序中,每次只能交換相鄰的兩個元素。
小藍髮現,若是對一個字符串中的字符排序,只容許交換相鄰的兩個字符,
則在全部可能的排序方案中,冒泡排序的總交換次數是最少的。
例如,對於字符串 lan 排序,只須要 1 次交換。對於字符串 qiao 排序,
總共須要 4 次交換。
小藍找到了不少字符串試圖排序,他恰巧碰到一個字符串,須要 100 次交
換,但是他忘了吧這個字符串記下來,如今找不到了。
請幫助小藍找一個只包含小寫英文字母且沒有字母重複出現的字符串,對
該串的字符排序,正好須要 100 次交換。若是可能找到多個,請告訴小藍最短的那個。若是最短的仍然有多個,請告訴小藍字典序最小的那個。請注意字符串中不能夠包含相同的字符。
答案提交
這是一道結果填空的題,你只須要算出結果後提交便可。本題的結果爲一
個只包含小寫英文字母的字符串,在提交答案時只填寫這個字符串,填寫多餘的內容將沒法得分。
NULL
首先肯定範圍,冒泡交換的次數是根據逆序數來看的,要交換100次的話,元素個數必須大於等於15個,而後枚舉就行,先吃個飯
calcCode:
import java.util.Arrays; public class Test { static final int len = 15; public static void main(String[] args) { char[] a = new char[len]; for (int i = 0; i < len; i++) a[i] = (char)('a' + i); do { int cnt = 0; for (int i = 0; i < len; i++) for (int j = 0; j < i; j++) if (a[i] < a[j]) cnt++; if (cnt == 100) { System.out.println(a); return; } } while (next(a)); } static boolean next(char[] a) { int i = a.length - 2; while (i >= 0 && a[i] > a[i + 1]) i--; if (i < 0) return false; int j = i + 1; char t = a[i]; while (j < a.length && a[j] > t) j++; a[i] = a[j - 1]; a[j - 1] = t; Arrays.sort(a, i + 1, a.length); return true; } }
寫出來後發現時間複雜度直接拉滿
先放放
#F 成績分析
時間限制: 1.0s 內存限制: 512.0MB 本題總分:15 分
問題描述
小藍給學生們組織了一場考試,卷面總分爲 100 分,每一個學生的得分都是
一個 0 到 100 的整數。
請計算此次考試的最高分、最低分和平均分。
輸入格式
輸入的第一行包含一個整數 n,表示考試人數。
接下來 n 行,每行包含一個 0 至 100 的整數,表示一個學生的得分。
輸出格式
輸出三行。
第一行包含一個整數,表示最高分。
第二行包含一個整數,表示最低分。
第三行包含一個實數,四捨五入保留正好兩位小數,表示平均分。
測試樣例1
Input: 7 80 92 56 74 88 99 10 Output: 99 10 71.29
評測用例規模與約定
對於 50% 的評測用例,1 ≤ n ≤ 100。
對於全部評測用例,1 ≤ n ≤ 10000。
code:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class Main { public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); in.nextToken(); int n = (int)in.nval, sum = 0, max = 0, min = 128; for (int i = 0, t; i < n; i++) { in.nextToken(); sum += t = (int)in.nval; if (t > max) max = t; if (t < min) min = t; } System.out.printf("%d\n%d\n%.2f", max, min, (double)sum / n); } }
#G 單詞分析
時間限制: 1.0s 內存限制: 512.0MB 本題總分:20 分
問題描述
小藍正在學習一門神奇的語言,這門語言中的單詞都是由小寫英文字母組
成,有些單詞很長,遠遠超過正常英文單詞的長度。小藍學了很長時間也記不
住一些單詞,他準備再也不徹底記憶這些單詞,而是根據單詞中哪一個字母出現得
最多來分辨單詞。
如今,請你幫助小藍,給了一個單詞後,幫助他找到出現最多的字母和這
個字母出現的次數。
輸入格式
輸入一行包含一個單詞,單詞只由小寫英文字母組成。
輸出格式
輸出兩行,第一行包含一個英文字母,表示單詞中出現得最多的字母是哪
個。若是有多個字母出現的次數相等,輸出字典序最小的那個。
第二行包含一個整數,表示出現得最多的那個字母在單詞中出現的次數。
測試樣例1
Input: lanqiao Output: a 2
測試樣例2
Input: longlonglongistoolong Output: o 6
評測用例規模與約定
對於全部的評測用例,輸入的單詞長度不超過 1000。
code:
import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { byte[] buff = new byte[1024]; int l = System.in.read(buff), max = 0; int[] cnt = new int[128]; for (int i = 0; i < l; i++) cnt[buff[i]]++; for (char i = 'z'; i >= 'a'; i--) if (cnt[i] >= max) { max = cnt[i]; l = i; } System.out.println((char)l + "\n" + max); } }
#H 數字三角形
時間限制: 1.0s 內存限制: 512.0MB 本題總分:20 分
問題描述
上圖給出了一個數字三角形。從三角形的頂部到底部有不少條不一樣的路徑。
對於每條路徑,把路徑上面的數加起來能夠獲得一個和,你的任務就是找到最大的和。
路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過 1。
輸入格式
輸入的第一行包含一個整數 N (1 < N ≤ 100),表示三角形的行數。下面的
N 行給出數字三角形。數字三角形上的數都是 0 至 100 之間的整數
輸出格式
輸出一個整數,表示答案。
測試樣例1
Input: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Output: 27
code:
#I 子串分值和
時間限制: 1.0s 內存限制: 512.0MB 本題總分:25 分
問題描述
對於一個字符串 S,咱們定義 S 的分值 f(S ) 爲 S 中出現的不一樣的字符個
數。例如 f(」aba」) = 2,f(」abc」) = 3, f(」aaa」) = 1。
如今給定一個字符串 S [0…n − 1](長度爲 n),請你計算對於全部 S 的非空
子串 S [i… j](0 ≤ i ≤ j < n),f(S [i… j]) 的和是多少。
輸入格式
輸入一行包含一個由小寫字母組成的字符串 S。
輸出格式
輸出一個整數表示答案。
測試樣例1
Input: ababc Output: 28 Explanation: 子串 f值 a 1 ab 2 aba 2 abab 2 ababc 3 b 1 ba 2 bab 2 babc 3 a 1 ab 2 abc 3 b 1 bc 2 c 1
評測用例規模與約定
對於 20% 的評測用例,1 ≤ n ≤ 10;
對於 40% 的評測用例,1 ≤ n ≤ 100;
對於 50% 的評測用例,1 ≤ n ≤ 1000;
對於 60% 的評測用例,1 ≤ n ≤ 10000;
對於全部評測用例,1 ≤ n ≤ 100000。
code:
#J 裝飾珠
時間限制: 1.0s 內存限制: 512.0MB 本題總分:25 分
問題描述
在怪物獵人這一款遊戲中,玩家能夠經過給裝備鑲嵌不一樣的裝飾珠來獲取
相應的技能,以提高本身的戰鬥能力。
已知獵人身上一共有 6 6 6 件裝備,每件裝備可能有若干個裝飾孔,每一個裝飾
孔有各自的等級,能夠鑲嵌一顆小於等於自身等級的裝飾珠 (也能夠選擇不鑲
嵌)。
裝飾珠有 M M M 種,編號 1 1 1 至 M M M,分別對應 M M M 種技能,第 i i i 種裝飾珠的等級
爲 L i L_{i} Li,只能鑲嵌在等級大於等於 L i L_i Li 的裝飾孔中。
對第 i i i 種技能來講,當裝備相應技能的裝飾珠數量達到 K i K_{i} Ki 個時,會產生
W i ( K i ) W_{i}(K_{i}) Wi(Ki) 的價值。鑲嵌同類技能的數量越多,產生的價值越大,即 W i ( K i − 1 ) < W i ( K i ) W_{i}(K_{i} - 1) < W_{i}(K_{i}) Wi(Ki−1)<Wi(Ki)。但每一個技能都有上限 P i ( 1 ≤ P i ≤ 7 ) P_{i}(1 ≤ P_{i} ≤ 7) Pi(1≤Pi≤7),當裝備的珠子數量超過 P i P_i Pi 時,只
會產生 W i ( P i ) W_{i}(P_{i}) Wi(Pi) 的價值。
對於給定的裝備和裝飾珠數據,求解如何鑲嵌裝飾珠,使得 6 件裝備能得
到的總價值達到最大。
輸入格式
輸入的第 1 1 1 至 6 6 6 行,包含 6 6 6 件裝備的描述。其中第 i i i 的第一個整數 N i N_{i} Ni 表示
第 i i i 件裝備的裝飾孔數量。後面緊接着 N i N_{i} Ni 個整數,分別表示該裝備上每一個裝飾
孔的等級 L ( 1 ≤ L ≤ 4 ) L(1 ≤ L ≤ 4) L(1≤L≤4)。
第 7 7 7 行包含一個正整數 M M M,表示裝飾珠 (技能) 種類數量。
第 8 8 8 至 M + 7 M + 7 M+7 行,每行描述一種裝飾珠 (技能) 的狀況。每行的前兩個整數
L j ( 1 ≤ L j ≤ 4 ) L_{j}(1 ≤ L_{j} ≤ 4) Lj(1≤Lj≤4) 和 P j ( 1 ≤ P i ≤ 7 ) P_{j}(1 ≤ P_{i} ≤ 7) Pj(1≤Pi≤7) 分別表示第 j j j 種裝飾珠的等級和上限。接下來
P j P_j Pj 個整數,其中第 k k k 個數表示裝備該中裝飾珠數量爲 k k k 時的價值 W j ( k ) W_{j}(k) Wj(k)。
輸出格式
輸出一行包含一個整數,表示可以獲得的最大價值。
測試樣例1
Input: 1 1 2 1 2 1 1 2 2 2 1 1 1 3 3 1 5 1 2 3 5 8 2 4 2 4 8 15 3 2 5 10 Output: 20 Explanation: 按照以下方式鑲嵌珠子獲得最大價值 18,括號內表示鑲嵌的裝飾珠的種類編號: 1: (1) 2: (1) (2) 3: (1) 4: (2) (2) 5: (1) 6: (2) 4 顆技能 1 裝飾珠,4 顆技能 2 裝飾珠 W1(4) + W2(4) = 5 + 15 = 20。
評測用例規模與約定
對於 30% 的評測用例,1 ≤ Ni ≤ 10, 1 ≤ M ≤ 20, 1 ≤ Wj(k) ≤ 500;
對於全部評測用例,1 ≤ Ni ≤ 50, 1 ≤ M ≤ 10000, 1 ≤ Wj(k) ≤ 10000。
code: