【OJ】2020蓝桥杯模拟赛题解(Java语言描述)
T1
問題描述
1200000有多少個約數(只計算正約數)。
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
分析:
填空題+小數據,暴力求解即可:
答案:96
T2
問題描述
在計算機存儲中,15.125GB是多少MB?
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
分析:
1GB=1024MB。
答案:15488
T3
問題描述
一棵包含有2019個結點的二叉樹,最多包含多少個葉結點?
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
分析:
我記不得是不是二叉樹了,如果是二叉樹,結果就是1010((2019+1)/2);否則如果是樹,就是2018。
T4
問題描述
在1至2019中,有多少個數的數位中包含數字9?
注意,有的數中的數位中包含多個9,這個數只算一次。例如,1999這個數包含數字9,在計算只是算一個數。
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
分析:
這題本該是有講究的,可惜數據量小還是填空題,就可以開暴力:
答案:544
T5
問題描述
一個正整數如果任何一個數位不大于右邊相鄰的數位,則稱為一個數位遞增的數,例如1135是一個數位遞增的數,而1024不是一個數位遞增的數。
給定正整數 n,請問在整數 1 至 n 中有多少個數位遞增的數?
輸入格式
輸入的第一行包含一個整數 n。
輸出格式
輸出一行包含一個整數,表示答案。
樣例輸入
30
樣例輸出
26
評測用例規模與約定
對于 40% 的評測用例,1 <= n <= 1000。
對于 80% 的評測用例,1 <= n <= 100000。
對于所有評測用例,1 <= n <= 1000000。
分析:
開暴力求解,利用char[]來逐一比較。
答案:
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt(), counter = 0;scanner.close();char[] temp;char prev;outer:for (int i = 1; i <= num; i++) {temp = Integer.toString(i).toCharArray();prev = temp[0];for (int j = 1; j < temp.length; j++) {if (prev > temp[j]) {continue outer;}prev = temp[j];}counter++;}System.out.println(counter);} }T6
問題描述
小明對類似于 hello 這種單詞非常感興趣,這種單詞可以正好分為四段,第一段由一個或多個輔音字母組成,第二段由一個或多個元音字母組成,第三段由一個或多個輔音字母組成,第四段由一個或多個元音字母組成。
給定一個單詞,請判斷這個單詞是否也是這種單詞,如果是請輸出yes,否則請輸出no。
元音字母包括 a, e, i, o, u,共五個,其他均為輔音字母。
輸入格式
輸入一行,包含一個單詞,單詞中只包含小寫英文字母。
輸出格式
輸出答案,或者為yes,或者為no。
樣例輸入
lanqiao
樣例輸出
yes
樣例輸入
world
樣例輸出
no
評測用例規模與約定
對于所有評測用例,單詞中的字母個數不超過100。
分析:
使用正則表達式即可,matches()是since1.4的,就能用。
注意這個正則怎么寫的,我們把元音字母1+和輔音字母1+分別做成正則表達式的子表達式,最后使用字符串連接湊成完整的正則表達式。
[aeiou]+[aeiou]+[aeiou]+ 表示任意 a、e、i、o、u 元素連續出現一次以上的貪婪匹配,
[bcdfghjklmnpqrstvwxyz]+[bcdfghjklmnpqrstvwxyz]+[bcdfghjklmnpqrstvwxyz]+ 表示輔音字母元素連續出現一次以上的貪婪匹配。
由于是貪婪匹配,所以能盡可能多的匹配,而不會導致意外的Bug。
答案:
import java.util.Scanner;public class Main {public static void main(String[] args) {String regex1 = "[aeiou]+", regex2 = "[bcdfghjklmnpqrstvwxyz]+";Scanner scanner = new Scanner(System.in);System.out.println((scanner.nextLine().matches(regex2+regex1+regex2+regex1)) ? "yes" : "no");scanner.close();} }T7
問題描述
在數列 a[1], a[2], …, a[n] 中,如果對于下標 i, j, k 滿足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],則稱 a[i], a[j], a[k] 為一組遞增三元組,a[j]為遞增三元組的中心。
給定一個數列,請問數列中有多少個元素可能是遞增三元組的中心。
輸入格式
輸入的第一行包含一個整數 n。
第二行包含 n 個整數 a[1], a[2], …, a[n],相鄰的整數間用空格分隔,表示給定的數列。
輸出格式
輸出一行包含一個整數,表示答案。
樣例輸入
5
1 2 5 3 5
樣例輸出
2
樣例說明
a[2] 和 a[4] 可能是三元組的中心。
評測用例規模與約定
對于 50% 的評測用例,2 <= n <= 100,0 <= 數列中的數 <= 1000。
對于所有評測用例,2 <= n <= 1000,0 <= 數列中的數 <= 10000。
分析:
開三指針即可,一個從1開始移動,剩下兩個就在兩側移動,只要找到一組符合要求的就可以counter++。
答案:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int num = Integer.parseInt(reader.readLine()), counter = 0;String[] nums = reader.readLine().split("\\s+");reader.close();int[] array = new int[num];for (int i = 0; i < num; i++) {array[i] = Integer.parseInt(nums[i]);}outer:for (int j = 1; j < num; j++) {for (int i = 0; i < j; i++) {for (int k = j+1; k < num; k++) {if (array[i] < array[j] && array[j] < array[k]) {counter++;continue outer;}}}}System.out.println(counter);} }T8
問題描述
小明有一塊空地,他將這塊空地劃分為 n 行 m 列的小塊,每行和每列的長度都為 1。
小明選了其中的一些小塊空地,種上了草,其他小塊仍然保持是空地。
這些草長得很快,每個月,草都會向外長出一些,如果一個小塊種了草,則它將向自己的上、下、左、右四小塊空地擴展,這四小塊空地都將變為有草的小塊。
請告訴小明,k 個月后空地上哪些地方有草。
輸入格式
輸入的第一行包含兩個整數 n, m。
接下來 n 行,每行包含 m 個字母,表示初始的空地狀態,字母之間沒有空格。如果為小數點,表示為空地,如果字母為 g,表示種了草。
接下來包含一個整數 k。
輸出格式
輸出 n 行,每行包含 m 個字母,表示 k 個月后空地的狀態。如果為小數點,表示為空地,如果字母為 g,表示長了草。
樣例輸入
4 5
.g…
…
…g…
…
2
樣例輸出
gggg.
gggg.
ggggg
.ggg.
評測用例規模與約定
對于 30% 的評測用例,2 <= n, m <= 20。
對于 70% 的評測用例,2 <= n, m <= 100。
對于所有評測用例,2 <= n, m <= 1000,1 <= k <= 1000。
分析:
開一個BFS,注意判斷防止重復搜索。
搜的時候,使用雙隊列,一個裝x一個裝y,每一輪都讓原隊列元素出隊,周圍能種草的位置入隊。
循環k輪,效率不至于太差。
注意判越界。
答案:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue;public class Main {public static void main(String[] args) throws IOException {//sb Java6Queue<Integer> queue_x = new LinkedList<Integer>();Queue<Integer> queue_y = new LinkedList<Integer>();BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String[] line1 = reader.readLine().split("\\s+");int n = Integer.parseInt(line1[0]), m = Integer.parseInt(line1[1]);char[][] graph = new char[n][m];for (int i = 0; i < n; i++) {char[] temp = reader.readLine().toCharArray();for (int j = 0; j < m; j++) {graph[i][j] = temp[j];if (temp[j] == 'g') {queue_x.offer(i);queue_y.offer(j);}}}int k = Integer.parseInt(reader.readLine());reader.close();for (int i = 0; i < k; i++) {int length = queue_x.size();for (int j = 0; j < length; j++) {int x = queue_x.poll(), y = queue_y.poll();if (x != 0 && graph[x-1][y] == '.') {queue_x.offer(x-1);queue_y.offer(y);graph[x-1][y] = 'g';}if (x != n-1 && graph[x+1][y] == '.') {queue_x.offer(x+1);queue_y.offer(y);graph[x+1][y] = 'g';}if (y != 0 && graph[x][y-1] == '.') {queue_x.offer(x);queue_y.offer(y-1);graph[x][y-1] = 'g';}if (y != m-1 && graph[x][y+1] == '.') {queue_x.offer(x);queue_y.offer(y+1);graph[x][y+1] = 'g';}}}StringBuilder result;for (int i = 0; i < n; i++) {result = new StringBuilder();for (int j = 0; j < m; j++) {result.append(graph[i][j]);}System.out.println(result);}} }T9
問題描述
小明想知道,滿足以下條件的正整數序列的數量:
1. 第一項為 n;
2. 第二項不超過 n;
3. 從第三項開始,每一項小于前兩項的差的絕對值。
請計算,對于給定的 n,有多少種滿足條件的序列。
輸入格式
輸入一行包含一個整數 n。
輸出格式
輸出一個整數,表示答案。答案可能很大,請輸出答案除以10000的余數。
樣例輸入
4
樣例輸出
7
樣例說明
以下是滿足條件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
評測用例規模與約定
對于 20% 的評測用例,1 <= n <= 5;
對于 50% 的評測用例,1 <= n <= 10;
對于 80% 的評測用例,1 <= n <= 100;
對于所有評測用例,1 <= n <= 1000。
分析:
使用動態規劃求解,動態轉移方程:f[i][j]=f[j][1]+…+f[j][abs(i?j)?1]+1f[i][j] = f[j][1] + … + f[j][abs(i-j)-1] + 1f[i][j]=f[j][1]+…+f[j][abs(i?j)?1]+1
答案:
import java.util.Scanner;public class Main {private static int[][] array;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();scanner.close();array = new int[num+1][num+1];int counter = 0;for (int i = 1; i <= num; i++) {counter += count(num, i);}System.out.println(counter % 10000);}private static int count(int n, int m) {if (array[n][m] != 0) {return array[n][m];}int temp = 1;for (int j = 1; j < Math.abs(n - m); j++) {temp = (temp + count(m, j)) % 10000;}return array[n][m] = temp;}}T10
問題描述
小明要組織一臺晚會,總共準備了 n 個節目。然后晚會的時間有限,他只能最終選擇其中的 m 個節目。
這 n 個節目是按照小明設想的順序給定的,順序不能改變。
小明發現,觀眾對于晚上的喜歡程度與前幾個節目的好看程度有非常大的關系,他希望選出的第一個節目盡可能好看,在此前提下希望第二個節目盡可能好看,依次類推。
小明給每個節目定義了一個好看值,請你幫助小明選擇出 m 個節目,滿足他的要求。
輸入格式
輸入的第一行包含兩個整數 n, m ,表示節目的數量和要選擇的數量。
第二行包含 n 個整數,依次為每個節目的好看值。
輸出格式
輸出一行包含 m 個整數,為選出的節目的好看值。
樣例輸入
5 3
3 1 2 5 4
樣例輸出
3 5 4
樣例說明
選擇了第1, 4, 5個節目。
評測用例規模與約定
對于 30% 的評測用例,1 <= n <= 20;
對于 60% 的評測用例,1 <= n <= 100;
對于所有評測用例,1 <= n <= 100000,0 <= 節目的好看值 <= 100000。
答案:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String[] line1 = reader.readLine().split("\\s+");int n = Integer.parseInt(line1[0]), m = Integer.parseInt(line1[1]);String[] line2 = reader.readLine().split("\\s+");reader.close();int[] likes = new int[n], sorted_likes = new int[n];for (int i = 0; i < n; i++) {sorted_likes[i] = likes[i] = Integer.parseInt(line2[i]);}Arrays.sort(sorted_likes);List<Integer> list = new ArrayList<Integer>();for (int i = n - m; i < n; i++) {list.add(sorted_likes[i]);}StringBuilder result = new StringBuilder();for (int i : likes) {if (list.contains(i)) {list.remove(Integer.valueOf(i));result.append(i).append(' ');}}System.out.println(result.toString().trim());} }總結
以上是生活随笔為你收集整理的【OJ】2020蓝桥杯模拟赛题解(Java语言描述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据库系统】大学模式
- 下一篇: 【软件工程】软件开发的本质