藍橋杯校內賽題解


A.1Mb=1024Kb

B.多少個9

問題描述

在1至2019中,有多少個數的數位中包括數字9?

注意,有的數中的數位中包含多個9,這個數只算一次。例如,1999這個數包含三個數位9,但在計算時只算做一個數。

在考試中,不知道1至2019的至中包不包括2019這個數,從結果上看應該是包括的:[1,2029]

C. 長草
問題描述
 小明有一塊空地,他將這塊空地划分為 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。
題解:
普通解法1:遍歷然后更新
大佬解法:
采用 廣度優先搜索的想法,設置一個隊列,第0月開始長草的先入隊,然后將四周的下一個月長草的入隊后出隊,直到月份為K
 1 Scanner scn=new Scanner(System.in);
 2         int n=scn.nextInt(),m=scn.nextInt();
 3         char[][] a=new char[n][m];
 4         String line;
 5         Queue<Node> queue=new LinkedList();
 6         for(int i=0;i<n;i++)
 7             {
 8             line=scn.next();
 9             for(int j=0;j<m;j++) {
10                 a[i][j]=line.charAt(j);
11                 if(a[i][j]=='g') {
12                     queue.offer(new Node(i,j,0));//0月入隊
13                 }
14             }
15             }
16         int k=scn.nextInt();
17         while(!queue.isEmpty()) {
18             Node q=queue.poll();
19             if(q.cnt==k+1)
20                 break;
21             a[q.x][q.y]='g';
22             //
23             if(q.x+1<n&&a[q.x+1][q.y]!='g') {
24                 queue.offer(new Node(q.x+1,q.y,q.cnt+1));
25             }
26             //
27             if(0<=q.x-1&&a[q.x-1][q.y]!='g') {
28                 queue.offer(new Node(q.x-1,q.y,q.cnt+1));
29             }
30             //
31             if(q.y+1<m&&a[q.x][q.y+1]!='g') {
32                 queue.offer(new Node(q.x,q.y+1,q.cnt+1));
33             }
34             //
35             if(0<=q.y-1&&a[q.x][q.y-1]!='g') {
36                 queue.offer(new Node(q.x,q.y-1,q.cnt+1));
37             }
38         }
39         for(int i=0;i<n;i++) {
40             for(int j=0;j<m;j++) {
41                 System.out.print(a[i][j]);
42             }
43             System.out.println();
44         }
D.選節目
問題描述
小明要組織一台晚會,總共准備了 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。
題解:
我考試的解法建立在讀錯題目的基礎上,這里重新讀題更新了傻瓜解法,注意題目中應該是建立在第一個節目最好看的基礎上,再選擇第二個節目,不是選擇所有節目好看值最大的節目。思路是,建立b[m]記錄m的節目,b[i]=max(a[x],x€[b[i-1]+1,n-m+i])的x,重復im次,其中,i=0時,max(a[x],x€[0,n-m+i])的x,這樣的傻瓜解法里面具有重復的遍歷次序,顯然可以優化,但是優化的話,似乎會引起大量的元素移動。
 1     Scanner scn=new Scanner(System.in);
 2         int n=scn.nextInt(),m=scn.nextInt();
 3         int[] a=new int[n];
 4         for(int i=0;i<n;i++) {
 5             a[i]=scn.nextInt();
 6         }
 7         int[] b=new int[m];
 8         for(int j=0;j<m;j++) {
 9             if(j!=0) {
10             for(int i=b[j-1]+1;i<=n-m+j;i++) {
11                 if(a[b[j]]<a[i])
12                     b[j]=i;
13             }
14             }
15             else {
16                 for(int i=0;i<=n-m;i++) {
17                     if(a[b[j]]<a[i])
18                         b[j]=i;
19                 }
20             }
21         }
22         for(int i=0;i<m;i++) {
23             System.out.print(a[b[i]]+" ");
24         }

大佬解法:大佬說這是一個求靜態區間最值 (static RMQ) 問題,使用任何一種能在 O(log2n)時間內求出長度為 n 區間最值的數據結構都可以。

他提供了

數據結構:parse Table(ST表)Segment Tree(線段樹/區間樹)Binary Indexed Tree(樹狀數組/二叉索引樹)

算法:規約LCA + 分塊

我另開一篇博客記錄這個:https://www.cnblogs.com/code-fun/p/12499895.html

 

本篇參考:https://blog.csdn.net/qq_42815590/article/details/103544729

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM