2017年第八屆藍橋杯JavaB組省賽試題解析


題目及解析如下:

題目大致介紹:

第一題到第四題是結果填空,方法不限只要得到最后結果就行

第五題和第六題是代碼填空題,主要考察算法基本功和編程基本功

第七題到第十題是編程題,要求編程解決問題

 

 

第一題  購物單

題目如下:

 1 標題: 購物單
 2 
 3     小明剛剛找到工作,老板人很好,只是老板夫人很愛購物。老板忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。
 4 
 5     這不,XX大促銷又來了!老板夫人開出了長長的購物單,都是有打折優惠的。
 6     小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定。
 7     現在小明很心煩,請你幫他計算一下,需要從取款機上取多少現金,才能搞定這次購物。
 8 
 9     取款機只能提供100元面額的紙幣。小明想盡可能少取些現金,夠用就行了。
10     你的任務是計算出,小明最少需要取多少現金。
11 
12 以下是讓人頭疼的購物單,為了保護隱私,物品名稱被隱藏了。
13 -----------------
14 ****     180.90       88折
15 ****      10.25       65折
16 ****      56.14        9折
17 ****     104.65        9折
18 ****     100.30       88折
19 ****     297.15        半價
20 ****      26.75       65折
21 ****     130.62        半價
22 ****     240.28       58折
23 ****     270.62        8折
24 ****     115.87       88折
25 ****     247.34       95折
26 ****      73.21        9折
27 ****     101.00        半價
28 ****      79.54        半價
29 ****     278.44        7折
30 ****     199.26        半價
31 ****      12.97        9折
32 ****     166.30       78折
33 ****     125.50       58折
34 ****      84.98        9折
35 ****     113.35       68折
36 ****     166.57        半價
37 ****      42.56        9折
38 ****      81.90       95折
39 ****     131.78        8折
40 ****     255.89       78折
41 ****     109.17        9折
42 ****     146.69       68折
43 ****     139.33       65折
44 ****     141.16       78折
45 ****     154.74        8折
46 ****      59.42        8折
47 ****      85.44       68折
48 ****     293.70       88折
49 ****     261.79       65折
50 ****      11.30       88折
51 ****     268.27       58折
52 ****     128.29       88折
53 ****     251.03        8折
54 ****     208.39       75折
55 ****     128.88       75折
56 ****      62.06        9折
57 ****     225.87       75折
58 ****      12.89       75折
59 ****      34.28       75折
60 ****      62.16       58折
61 ****     129.12        半價
62 ****     218.37        半價
63 ****     289.69        8折
64 --------------------
65 
66 需要說明的是,88折指的是按標價的88%計算,而8折是按80%計算,余者類推。
67 特別地,半價是按50%計算。
68 
69 請提交小明要從取款機上提取的金額,單位是元。
70 答案是一個整數,類似4300的樣子,結尾必然是00,不要填寫任何多余的內容。
71 
72 
73 特別提醒:不許攜帶計算器入場,也不能打開手機。

思路:將上面出現的數字復制進eclipse,然后把****改成+把文字去掉,半折改成50,在數字與打的折之間加“0.” 最后得出結果

另外注意根據題目要求最后算出來的最后兩位要是00,換句話說就是要向上取整,舉個例子比如算出來是3546,那么最后答案應該是3600

 

此題答案:5200,代碼如下:

 1 public class t1 {
 2     public static void main(String[] args) {
 3         double res = 0 + 180.90 * 0.88 + 10.25 * 0.65 + 56.14 * 0.9
 4                 + 104.65 * 0.9 + 100.30 * 0.88 + 297.15 * 0.5 + 26.75 * 0.65
 5                 + 130.62 * 0.5 + 240.28 * 0.58 + 270.62 * 0.8 + 115.87 * 0.88
 6                 + 247.34 * 0.95 + 73.21 * 0.9 + 101.00 * 0.5 + 79.54 * 0.5
 7                 + 278.44 * 0.7 + 199.26 * 0.5 + 12.97 * 0.9 + 166.30 * 0.78
 8                 + 125.50 * 0.58 + 84.98 * 0.9 + 113.35 * 0.68 + 166.57 * 0.5
 9                 + 42.56 * 0.9 + 81.90 * 0.95 + 131.78 * 0.8 + 255.89 * 0.78
10                 + 109.17 * 0.9 + 146.69 * 0.68 + 139.33 * 0.65 + 141.16 * 0.78
11                 + 154.74 * 0.8 + 59.42 * 0.8 + 85.44 * 0.68 + 293.70 * 0.88
12                 + 261.79 * 0.65 + 11.30 * 0.88 + 268.27 * 0.58 + 128.29 * 0.88
13                 + 251.03 * 0.8 + 208.39 * 0.75 + 128.88 * 0.75 + 62.06 * 0.9
14                 + 225.87 * 0.75 + 12.89 * 0.75 + 34.28 * 0.75 + 62.16 * 0.58
15                 + 129.12 * 0.5 + 218.37 * 0.5 + 289.69 * 0.8;
16         System.out.println(res);
17         int r = (int) res;
18         r = r % 100 != 0 ? r - r % 100 + 100 : r;
19         System.out.println(r);
20     }
21 }

 

 

第二題  紙牌三角形

題目如下:

 1 標題:紙牌三角形
 2 
 3 A,2,3,4,5,6,7,8,9 共9張紙牌排成一個正三角形(A按1計算)。要求每個邊的和相等。
 4 下圖就是一種排法(如有對齊問題,參看p1.png)。
 5 
 6       A
 7      9 6
 8     4   8
 9    3 7 5 2
10 
11 這樣的排法可能會有很多。
12 
13 如果考慮旋轉、鏡像后相同的算同一種,一共有多少種不同的排法呢?
14 
15 請你計算並提交該數字。
16 
17 注意:需要提交的是一個整數,不要提交任何多余內容。

思路:對1、2、3、4、5、6、7、8、9進行全排列然后check,然后最后結果除以6(每種全排列的結果都會有6種)

代碼如下:

 1 public class t2 {
 2 
 3     public static int res = 0;
 4 
 5     public static void f(int[] arr, int n) {
 6 
 7         if (n == arr.length) {
 8             if (arr[0] + arr[1] + arr[3] + arr[5] == arr[5] + arr[6] + arr[7] + arr[8]
 9                     && arr[5] + arr[6] + arr[7] + arr[8] == arr[0] + arr[2] + arr[4] + arr[8]) {
10                 res += 1;
11             }
12             return;
13         }
14 
15         for (int i = n; i < arr.length; i++) {
16             int temp = arr[n];
17             arr[n] = arr[i];
18             arr[i] = temp;
19             f(arr, n + 1);
20             temp = arr[n];
21             arr[n] = arr[i];
22             arr[i] = temp;
23         }
24 
25     }
26 
27     public static void main(String[] args) {
28         int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
29         f(arr, 0);
30         System.out.println(res);
31         System.out.println(res / 6);  // 答案: 144
32     }
33 
34 }

 

 

第三題  承壓計算

題目如下:

 1 標題:承壓計算
 2 
 3 X星球的高科技實驗室中整齊地堆放着某批珍貴金屬原料。
 4 
 5 每塊金屬原料的外形、尺寸完全一致,但重量不同。
 6 金屬材料被嚴格地堆放成金字塔形。
 7 
 8                              7 
 9                             5 8 
10                            7 8 8 
11                           9 2 7 2 
12                          8 1 4 9 1 
13                         8 1 8 8 4 1 
14                        7 9 6 1 4 5 4 
15                       5 6 5 5 6 9 5 6 
16                      5 5 4 7 9 3 5 5 1 
17                     7 5 7 9 7 4 7 3 3 1 
18                    4 6 4 5 5 8 8 3 2 4 3 
19                   1 1 3 3 1 6 6 5 5 4 4 2 
20                  9 9 9 2 1 9 1 9 2 9 5 7 9 
21                 4 3 3 7 7 9 3 6 1 3 8 8 3 7 
22                3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
23               8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
24              8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
25             2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
26            7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
27           9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
28          5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
29         6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
30        2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
31       7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
32      1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
33     2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 
34    7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 
35   7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 
36  5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 
37 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
38 
39 其中的數字代表金屬塊的重量(計量單位較大)。
40 最下一層的X代表30台極高精度的電子秤。
41 
42 假設每塊原料的重量都十分精確地平均落在下方的兩個金屬塊上,
43 最后,所有的金屬塊的重量都嚴格精確地平分落在最底層的電子秤上。
44 電子秤的計量單位很小,所以顯示的數字很大。
45 
46 工作人員發現,其中讀數最小的電子秤的示數為:2086458231
47 
48 請你推算出:讀數最大的電子秤的示數為多少?
49 
50 注意:需要提交的是一個整數,不要填寫任何多余的內容。

 

 

第四題  魔法狀態

涉及到數學問題,難度大,我選擇放棄

 

 

第五題  取數位

題目如下:

 1 標題:取數位
 2 
 3 求1個整數的第k位數字有很多種方法。
 4 以下的方法就是一種。
 5 
 6 public class Main
 7 {
 8     static int len(int x){
 9         if(x<10) return 1;
10         return len(x/10)+1;
11     }
12     
13     // 取x的第k位數字
14     static int f(int x, int k){
15         if(len(x)-k==0) return x%10;
16         return ______________________;  //填空
17     }
18     
19     public static void main(String[] args)
20     {
21         int x = 23513;
22         //System.out.println(len(x));
23         System.out.println(f(x,3));
24     }
25 }
26 
27 對於題目中的測試數據,應該打印5。
28 
29 請仔細分析源碼,並補充划線部分所缺少的代碼。
30 
31 注意:只提交缺失的代碼,不要填寫任何已有內容或說明性的文字。

代碼:

 1 public class t5 {
 2     
 3     static int len(int x){
 4         if(x<10) return 1;
 5         return len(x/10)+1;
 6     }
 7     
 8     // 取x的第k位數字
 9     static int f(int x, int k){
10         if(len(x)-k==0) return x%10;
11         return f(x/10, k);  //填空
12     }
13     
14     public static void main(String[] args)
15     {
16         int x = 23513;
17         //System.out.println(len(x));
18         System.out.println(f(x,3));
19     }
20     
21 }

 

 

第六題  最大公共子串

題目如下:

 1 標題:最大公共子串
 2 
 3 最大公共子串長度問題就是:
 4 求兩個串的所有子串中能夠匹配上的最大長度是多少。
 5 
 6 比如:"abcdkkk" 和 "baabcdadabc" 7 可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。
 8 
 9 下面的程序是采用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。
10 
11 請分析該解法的思路,並補全划線部分缺失的代碼。
12 
13 
14 
15 public class Main
16 {
17     static int f(String s1, String s2)
18     {
19         char[] c1 = s1.toCharArray();
20         char[] c2 = s2.toCharArray();
21         
22         int[][] a = new int[c1.length+1][c2.length+1];
23         
24         int max = 0;
25         for(int i=1; i<a.length; i++){
26             for(int j=1; j<a[i].length; j++){
27                 if(c1[i-1]==c2[j-1]) {
28                     a[i][j] = __________________;  //填空 
29                     if(a[i][j] > max) max = a[i][j];
30                 }
31             }
32         }
33         
34         return max;
35     }
36     
37     public static void main(String[] args){
38         int n = f("abcdkkk", "baabcdadabc");
39         System.out.println(n);
40     }
41 }
42 
43 
44 注意:只提交缺少的代碼,不要提交已有的代碼和符號。也不要提交說明性文字

代碼(動態規划):

 1 public class t6 {
 2     static int f(String s1, String s2) {
 3         char[] c1 = s1.toCharArray();
 4         char[] c2 = s2.toCharArray();
 5 
 6         int[][] a = new int[c1.length + 1][c2.length + 1];
 7 
 8         int max = 0;
 9         for (int i = 1; i < a.length; i++) {
10             for (int j = 1; j < a[i].length; j++) {
11                 if (c1[i - 1] == c2[j - 1]) {
12                     a[i][j] = a[i - 1][j - 1] + 1; // 填空
13                     if (a[i][j] > max)
14                         max = a[i][j];
15                 }
16             }
17         }
18 
19         return max;
20     }
21 
22     public static void main(String[] args) {
23         int n = f("abcdkkk", "baabcdadabc");
24         System.out.println(n);
25     }
26 }

 

 

第七題  日期問題

題目如下:

 1 標題:日期問題
 2 
 3 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期采用的格式非常不統一,有采用年/月/日的,有采用月/日/年的,還有采用日/月/年的。更加麻煩的是,年份也都省略了前兩位,使得文獻上的一個日期,存在很多可能的日期與其對應。  
 4 
 5 比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。  
 6 
 7 給出一個文獻上的日期,你能幫助小明判斷有哪些可能的日期對其對應嗎?
 8 
 9 輸入
10 ----
11 一個日期,格式是"AA/BB/CC"。  (0 <= A, B, C <= 9)  
12 
13 輸入
14 ----
15 輸出若干個不相同的日期,每個日期一行,格式是"yyyy-MM-dd"。多個日期按從早到晚排列。  
16 
17 樣例輸入
18 ----
19 02/03/04  
20 
21 樣例輸出
22 ----
23 2002-03-04  
24 2004-02-03  
25 2004-03-02  
26 
27 資源約定:
28 峰值內存消耗(含虛擬機) < 256M
29 CPU消耗  < 1000ms
30 
31 
32 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
33 
34 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
35 不要使用package語句。不要使用jdk1.7及以上版本的特性。
36 主類的名字必須是:Main,否則按無效代碼處理。

 

 

 

第九題 分巧克力

 1 標題: 分巧克力
 2 
 3     兒童節那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。
 4     小明一共有N塊巧克力,其中第i塊是Hi x Wi的方格組成的長方形。
 5 
 6     為了公平起見,小明需要從這 N 塊巧克力中切出K塊巧克力分給小朋友們。切出的巧克力需要滿足:
 7 
 8     1. 形狀是正方形,邊長是整數  
 9     2. 大小相同  
10 
11 例如一塊6x5的巧克力可以切出6塊2x2的巧克力或者2塊3x3的巧克力。
12 
13 當然小朋友們都希望得到的巧克力盡可能大,你能幫小Hi計算出最大的邊長是多少么?
14 
15 輸入
16 第一行包含兩個整數N和K。(1 <= N, K <= 100000)  
17 以下N行每行包含兩個整數Hi和Wi。(1 <= Hi, Wi <= 100000) 
18 輸入保證每位小朋友至少能獲得一塊1x1的巧克力。   
19 
20 輸出
21 輸出切出的正方形巧克力最大可能的邊長。
22 
23 樣例輸入:
24 2 10  
25 6 5  
26 5 6  
27 
28 樣例輸出:
29 2
30 
31 資源約定:
32 峰值內存消耗(含虛擬機) < 256M
33 CPU消耗  < 1000ms
34 
35 
36 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
37 
38 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
39 不要使用package語句。不要使用jdk1.7及以上版本的特性。
40 主類的名字必須是:Main,否則按無效代碼處理

 

 

 

 

第八題  包子湊數   第十題 k倍區間

涉及到數學問題,難度大,我選擇放棄

 


免責聲明!

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



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