Java_B组2017年省赛真题

  • 01 购物单
  • 02 纸牌三角形
  • 03 承压计算
  • 04 魔方状态
  • 05 取数位
  • 06 最大公共子串
  • 07 日期问题
  • 08 包子凑数
  • 09 分巧克力
  • 10 k倍区间

01 购物单

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。

取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。

你的任务是计算出,小明最少需要取多少现金。

以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了
-----------------
180.90 88折
10.25 65折
56.14 9折
104.65 9折
100.30 88折
297.15 半价
26.75 65折
130.62 半价
240.28 58折
270.62 8折
115.87 88折
247.34 95折
73.21 9折
101.00 半价
79.54 半价
278.44 7折
199.26 半价
12.97 9折
166.30 78折
125.50 58折
84.98 9折
113.35 68折
166.57 半价
42.56 9折
81.90 95折
131.78 8折
255.89 78折
109.17 9折
146.69 68折
139.33 65折
141.16 78折
154.74 8折
59.42 8折
85.44 68折
293.70 88折
261.79 65折
11.30 88折
268.27 58折
128.29 88折
251.03 8折
208.39 75折
128.88 75折
62.06 9折
225.87 75折
12.89 75折
34.28 75折
62.16 58折
129.12 半价
218.37 半价
289.69 8折
-----------------
需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。
特别地,半价是按50%计算。

请提交小明要从取款机上提取的金额,单位是元。
答案是一个整数,类似4300的样子,结尾必然是00,不要填写任何多余的内容。

特别提醒:不许携带计算器入场,也不能打开手机。

  • 答案:5200

  • 方法:使用excel

    1、复制数据到excel后,点击 “数据”–>’‘分列’’–>“分隔符号”–>“空格”–>“完成”

    2、手动把折扣换成小数,计算每个物品的折后价格;

    3、求和:excel求和公式 =SUM(a:b) ,为a到b的和;

    4、等到结果为5124.948,由于结果要取整百,故答案为5200.

02 纸牌三角形

A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法:


这样的排法可能会有很多。

如果考虑 旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?

请你计算并提交该数字。

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

  • 答案:144

  • 方法:全排列+去重(每种情况的重复有6种,故计数后 ans/6 即可)

    public class B_02纸牌三角形 {static int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };static int ans;public static void main(String[] args) {f(0);System.out.println(ans / 6);}private static void f(int k) {if (k == arr.length) {// 从0到8横着数三角形int a1 = arr[0] + arr[1] + arr[3] + arr[5];   // 左侧边和int a2 = arr[0] + arr[2] + arr[4] + arr[8];  // 右侧边和int a3 = arr[5] + arr[6] + arr[7] + arr[8];  // 底侧边和if (a1 == a2 && a1 == a3) {ans++;return;}}for (int i = k; i < arr.length; i++) {int t = arr[i];arr[i] = arr[k];arr[k] = t;f(k + 1);t = arr[i];arr[i] = arr[k];arr[k] = t;}}
    }
    

03 承压计算

X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。

                              7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 8 8 4 1 7 9 6 1 4 5 4 5 6 5 5 6 9 5 6 5 5 4 7 9 3 5 5 1 7 5 7 9 7 4 7 3 3 1 4 6 4 5 5 8 8 3 2 4 3 1 1 3 3 1 6 6 5 5 4 4 2 9 9 9 2 1 9 1 9 2 9 5 7 9 4 3 3 7 7 9 3 6 1 3 8 8 3 7 3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 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 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 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 97 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 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 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

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

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

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

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

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

  • 答案:72665192664

  • 方法:乘2 30 放大

    1、算上包含x的行总共有30行,最大列也为30,采用二维数组进行存储;

    2、由上至下,每个数 a[i]\[j] * factor(2的30次方) ,再除以2,计入后一行 a[i+1][j] 和 a[i+1][j+1] 中,直至最后一行;

    3、对a[N-1] 行进行排序,因为题中给出最小数为 2086458231,根据所给最小值查看最小值与factor之间的倍数关系,决定最大值。

import java.util.Arrays;
import java.util.Scanner;public class B_03承压计算 {static long[][] arr = new long[30][30];public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 2的29次方,最后的最小值和2086458231比对后,放大2的29次方后,最小值相符long factor = 1;for (int i = 0; i < 29; i++)factor <<= 1;// 输入数据for (int i = 0; i < 29; i++) { // 1~29行是物体重量for (int j = 0; j <= i; j++) { //long a = sc.nextLong();arr[i][j] = a * factor;}}// 处理for (int i = 0; i < 29; i++) {for (int j = 0; j <= i; j++) {long half = arr[i][j] / 2;arr[i + 1][j] += half;arr[i + 1][j + 1] += half;}}// 对最后一行排序Arrays.sort(arr[29]);System.out.println(arr[29][0]);System.out.println(arr[29][29]);}
}

04 魔方状态

二阶魔方就是只有2层的魔方,只由8个小块组成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YtolMXp8-1648225767807)(Java_B组2017年真题.assets/image-20220319215719299.png)]

小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下:

前面:橙色
右面:绿色
上面:黄色
左面:绿色
下面:橙色
后面:黄色

请你计算一下,这样的魔方被打乱后,一共有多少种不同的状态。

如果两个状态经过魔方的整体旋转后,各个面的颜色都一致,则认为是同一状态。

请提交表示状态数的整数,不要填写任何多余内容或说明文字。