华为OD机试 - 太阳能板最大面积(C语言)
题目描述
给航天器一侧安装矩形或方块状的太阳能板(图中标注为红色斜线区域),首先要放置两根支撑杆(图中标注为黑色竖条),然后将太阳能板固定在支撑杆中间部分。
然而,在宇宙飞船的不同部位上,支撑杆的长度各不相同;太阳能板的安装面积受限于支撑杆最小一端的尺寸;如图所示。

给定一组整型数组中的支柱高度数据,并且假设相邻两根支柱之间的间距均为1个单位长度,请计算并确定哪两根支柱的选择能够使太阳能板覆盖的最大面积达到最大值。
输入描述
10,9,8,7,6,5,4,3,2,1
注:为了确保设计系统的稳定性和可靠性,在实际应用中需要满足以下条件:首先,在系统运行过程中各节点数量应满足N≥2且N≤1e4的要求;其次,在设计时应考虑系统的可扩展性,在硬件资源允许的情况下最大可扩展至N=1e4个节点;此外,在性能指标方面系统应保证在工作负载压力下持续稳定运行至少T=1e9次操作。各节点之间的通信时延必须严格控制在τ=O(1)量级以确保系统的实时响应能力;此外,在网络拓扑结构设计上应避免出现严格的层次化结构以减少潜在的安全风险和管理复杂度。
输出描述
可以支持的最大太阳能板面积:(10米高支柱和5米高支柱之间)
25
用例
| 输入 | 10,9,8,7,6,5,4,3,2,1 |
|---|---|
| 输出 | 25 |
| 备注 | 10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高也是5,面积为25。 任取其他两根支柱所能获得的面积都小于25。 所以最大的太阳能板面积为25。 |
题目解析
本题可以使用双指针解题:
一开始i指针指向0,j指针指向arr.length-1

假设数组元素arr[i]小于arr[j];那么当前的元素arr[i]被视为一个'矮柱'(Low Column),而arr[j]被视为一个'高柱'(High Column)。针对当前的矮柱元素arr[i}进行处理,则其作为'矮柱'的最大面积值即为(j - i) \times (arr [i]);随后将索引i向前移动一位(因为此时i=0位置的'矮柱'最大面积已计算完毕)。

当下arr[i]> arr[j]$, 那么arr[j]$被确定为矮柱, 而arr[i]$则是高柱. 从处理的方式来看, 当前的j作为矮柱, 其最大面积即为(j-i)\times arr[j] . 然后将j指针向前移动一位(因为此时的j已经是数组最后一个元素, 其最大面积已经计算完毕).
基于此循环机制,在此循环运行中(直至ij交汇处),系统持续致力于识别矮柱并计算固定高度下的最大底面积。
该方法的时间复杂度为O(n)
2023.06.11
在本题中需要考虑太阳能板的最大面积是否存在一定的风险可能会导致整型溢出的情况出现为了避免该问题建议采用长整型变量long来存储数据以确保计算结果的准确性
C算法源码
#include <stdio.h>
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MAX_SIZE 10000
int main() {
int heights[MAX_SIZE];
int heights_size = 0;
while(scanf("%d", &heights[heights_size++])) {
if(getchar() != ',') break;
}
int l = 0;
int r = heights_size - 1;
long maxArea = 0;
while(l < r) {
long x = r - l;
long y = heights[l] < heights[r] ? heights[l++] : heights[r--];
maxArea = MAX(maxArea, x * y);
}
printf("%ld\n", maxArea);
return 0;
}
