华为OD机试【太阳能板最大面积】(java)(100分)
1、题目描述
为航天器的一侧安装长方形或正方形形状的太阳能板(见图中所示的红色斜线区域),则需先安装两根垂直支撑杆(见图中标注的黑色竖条)。接着将太阳能板固定在两根支撑杆之间的中部位置。然而,在航天器的不同位置上各支撑杆的高度有所差异,则导致在同一侧上可安装的最大面积会因各段支撑杆高度的不同而变化不一。为了简化问题,在此我们假定每两根相邻支撑杆之间的水平距离均为1个单位长度,并给出一组整数数组的数据:假设每组数据均代表各段支撑杆的高度值,请计算如何选择两段相邻支撑杆使得所形成的矩形区域面积达到最大值。

2、输入描述
十、九、八、七、六、五、四、三、二、一
注:最少需要两根支柱,在最大情况下可容纳一万根支柱;其支撑的高度范围限定于从一到十亿个单位的整数值。值得注意的是,在本例中柱子高度并无固定的排列顺序;举例而言,并非所有情况都是递减排列。
3、输出描述
可以支持的最大太阳能板面积:(10米高支柱和5米高支柱之间)
25
用例:
输入
10,9,8,7,6,5,4,3,2,1
输出
25
ps:
10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高也是5,面积为25
任取其他两根支柱所能获得的面积都小于25
所以最大的太阳能板面积为25
温馨提示:
官方明确表示会对考生在华为OD机试考试中的代码进行查重。由于题库的存在,在考试中抽到原题的可能性较大。遇到原题时必须进行必要的修改——不仅仅是变量名称的更换,此外还需要对代码的整体架构和逻辑结构进行相应优化。因此,在日常刷题的过程中应尽量避免直接复制粘贴他人的解法,并应在刷题过程中预先准备独立完成的代码。
4、题解
本题的关键在于确定太阳能板覆盖区域的最短一侧的支柱高度,并采用双指针法进行遍历计算。具体步骤如下:首先初始化两个指针分别指向两端的支柱,并初始化总面积为零。接着通过双指针法循环遍历所有相邻的两组支柱:如果当前这根支柱的高度较低,则该区域的面积等于该根支柱的高度乘以相邻两根之间的距离;反之,则该区域的面积等于另一根较高的支柱高度乘以相邻两根之间的距离。重复上述操作直到所有相邻柱组合被遍历完毕即可得到整个太阳能板区域的总面积计算公式
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = Arrays.stream(sc.nextLine().split(","))
.mapToInt(Integer::parseInt).toArray();
int maxRes = 0;
int left = 0;
int right = arr.length - 1;
while (left < right) {
if (arr[left] <= arr[right]) {
int tmp = arr[left] * (right - left);
maxRes = Math.max(maxRes, tmp);
left++;
}else {
int tmp = arr[right] * (right - left);
maxRes = Math.max(maxRes, tmp);
right--;
}
}
System.out.println(maxRes);
}
执行结果如下:

