蓝桥杯java第八届考题_2017年第八届蓝桥杯JavaB组省赛试题解析

题目及解析如下:

题目大致介绍:

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

第五题和第六题是代码填空题,主要考察算法基本功和编程基本功

第七题到第十题是编程题,要求编程解决问题

第一题  购物单

题目如下:

1 标题: 购物单2

3 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。4

5 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。6 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。7 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。8

9 取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。10 你的任务是计算出,小明最少需要取多少现金。11

12 以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。13 -----------------

14 **** 180.9088折15 **** 10.2565折16 **** 56.149折17 **** 104.659折18 **** 100.3088折19 **** 297.15半价20 **** 26.7565折21 **** 130.62半价22 **** 240.2858折23 **** 270.628折24 **** 115.8788折25 **** 247.3495折26 **** 73.219折27 **** 101.00半价28 **** 79.54半价29 **** 278.447折30 **** 199.26半价31 **** 12.979折32 **** 166.3078折33 **** 125.5058折34 **** 84.989折35 **** 113.3568折36 **** 166.57半价37 **** 42.569折38 **** 81.9095折39 **** 131.788折40 **** 255.8978折41 **** 109.179折42 **** 146.6968折43 **** 139.3365折44 **** 141.1678折45 **** 154.748折46 **** 59.428折47 **** 85.4468折48 **** 293.7088折49 **** 261.7965折50 **** 11.3088折51 **** 268.2758折52 **** 128.2988折53 **** 251.038折54 **** 208.3975折55 **** 128.8875折56 **** 62.069折57 **** 225.8775折58 **** 12.8975折59 **** 34.2875折60 **** 62.1658折61 **** 129.12半价62 **** 218.37半价63 **** 289.698折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 classt1 {2 public static voidmain(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 A7 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 classt2 {2

3 public static int res = 0;4

5 public static void f(int[] arr, intn) {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 voidmain(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 X38

39 其中的数字代表金属块的重量(计量单位较大)。40 最下一层的X代表30台极高精度的电子秤。41

42 假设每块原料的重量都十分精确地平均落在下方的两个金属块上,43 最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。44 电子秤的计量单位很小,所以显示的数字很大。45

46 工作人员发现,其中读数最小的电子秤的示数为:2086458231

47

48 请你推算出:读数最大的电子秤的示数为多少?49

50 注意:需要提交的是一个整数,不要填写任何多余的内容。

第四题  魔法状态

涉及到数学问题,难度大,我选择放弃

第五题  取数位

题目如下:

1 标题:取数位2

3 求1个整数的第k位数字有很多种方法。4 以下的方法就是一种。5

6 public classMain7 {8 static int len(intx){9 if(x<10) return 1;10 return len(x/10)+1;11 }12

13 //取x的第k位数字

14 static int f(int x, intk){15 if(len(x)-k==0) return x%10;16 return ______________________; //填空

17 }18

19 public static voidmain(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 classt5 {2

3 static int len(intx){4 if(x<10) return 1;5 return len(x/10)+1;6 }7

8 //取x的第k位数字

9 static int f(int x, intk){10 if(len(x)-k==0) return x%10;11 return f(x/10, k); //填空

12 }13

14 public static voidmain(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 classMain16 {17 static intf(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

29 if(a[i][j] > max) max =a[i][j];30 }31 }32 }33

34 returnmax;35 }36

37 public static voidmain(String[] args){38 int n = f("abcdkkk", "baabcdadabc");39 System.out.println(n);40 }41 }42

43

44 注意:只提交缺少的代码,不要提交已有的代码和符号。也不要提交说明性文字

代码(动态规划):

1 public classt6 {2 static intf(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 returnmax;20 }21

22 public static voidmain(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 峰值内存消耗(含虚拟机) <256M29 CPU消耗 <1000ms30

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 峰值内存消耗(含虚拟机) <256M33 CPU消耗 <1000ms34

35

36 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。37

38 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。39 不要使用package语句。不要使用jdk1.7及以上版本的特性。40 主类的名字必须是:Main,否则按无效代码处理

第八题  包子凑数   第十题 k倍区间

涉及到数学问题,难度大,我选择放弃

你可能感兴趣的:(蓝桥杯java第八届考题)