【题目】
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 9
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
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
请你推算出:读数最大的电子秤的示数为多少?
【分析】
本题可以通过一个二维数组来存储每块的重量,而后通过一个简单的递归来把每一层每一块的重量平均分散到下一层的两块身上
创建一个double[30][30]的二维数组,然后第一层1块金属,第二层2个,3,4…,第三十层是电子称
最后输出最后一层电子秤的重量发现最小的只有3.8863313030451536,最大是135.34946863353252,首先检查一遍代码对错,是正确的
那么就只有一种情况,单位不一样,需要我们转换一下单位,接下来请先看代码演示
【代码演示】
import java.util.Scanner;
class Main {
// 储存重量的二维数组,初始值是0.0
static double[][] num = new double[30][30];
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
// 将二维数组里1到29行递增填入值
for (int i = 0; i < 29; i++) {
for (int j = 0; j <= i; j++) {
num[i][j] = sr.nextDouble();
}
}
// 运行递归方法
helper(0);
// 创建接收最大值和最小值的变量
double min = num[29][0], max = num[29][0];
// 找出最大重量和最小重量
for (int k = 0; k < 30; k++) {
if (num[29][k] < min) min = num[29][k];
if (num[29][k] > max) max = num[29][k];
}
// 转换单位:最大重量/最小*题中给的最小重量
System.out.println();
System.out.printf("%d", (int) (max / min * (double) 2086458231));
}
static void helper(int i) {
// 当到29层就停止
if (i == 29) {
return;
}
// 将每一层每一个数除2分别给下一层的当前坐标和下一层的后一位坐标
for (int j = 0; j < i + 1; j++) {
num[i + 1][j] += num[i][j] / 2;
num[i + 1][j + 1] += num[i][j] / 2;
}
// 层数+1
i++;
helper(i);
}
}
【再次分析】
转换单位公式:最大重量/最小*题中给的最小重量,除了用到转换单位,还需要格式化输出,因为最大质量单位转换之后非常大,直接输出是16进制,所以需要对结果格式化输出System.out.printf("%d", (int) (max / min * (double),"%d"的意思是对整数类型以10进制输出,后面的除乘法是转换单位
【答案是2147483647】