题目描述
给航天器一侧加装长方形和正方形的太阳能板,需要先安装两个支柱,再在支柱的中间部分固定太阳能板;但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那支支柱的长度。
现提供一组整型数组的支柱高度数据,假设每个支柱间的距离相等为一个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。
输入描述
10,9,8,7,6,5,4,3,2,1
注释,支柱至少有两根,最多10000根,能支持的高度范围1~10^9的整数.
柱子的高度是无序的,例子中的递减是巧合。
输出描述
可以支持的最大太阳板面积:(10m高支柱和5m高支柱之间)
25
示例1
输入
10,9,8,7,6,5,4,3,2,1
输出
25
备注:10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高度也是5,面积为25,任取其他两根支柱所能获得的面积都小于25 所以最大面积为25。
思路分析
10米高支柱和5米高支柱之间宽度为5,柱子的高度是无序的,所以宽等于高支柱的高减去低支柱的高。高度取小的支柱高度。任取其他两根支柱所能获得的面积,取其中最大的。
测试用例
1,2,3,4,5,6,7,8,9,10
25
10,9,8,7,6,5,4,3,2,1
25
1,7,8,9,8,5,8,9
30
C语言题解:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10002
int main()
{
int arr[MAX];
int size = 0;
char a;
int tmp = 0;
// 处理输入
do {
a = getchar();
if (a >= '0' && a<= '9') {
tmp = tmp*10 + a - '0'; // 将字符串转化为数字
} else { // ,
arr[size++] = tmp; // 将数字存储到数组中
tmp = 0;
}
} while (a != '\n');
int area;
int max_area = 0;
for (int i=0; i<size; i++) {
int width = arr[i]; // 保存开始位置作为初始高度
for (int j=i+1; j<size; j++) {
width = width<arr[j] ? width : arr[j]; // 遍历获取最小高度
area = width * (j-i);
if (area > max_area) {
max_area = area;
}
}
}
printf("%d", max_area);
return 0;
}
golang 题解:
package main
import (
"fmt"
)
func main() {
var a byte
var tmp int
var arr []int
for {
fmt.Scanf("%c", &a)
if a >= '0' && a <= '9' {
tmp = tmp*10 + (int)(a - '0')
} else {
arr = append(arr, tmp)
tmp = 0
}
if a == '\n' {
break;
}
}
var area int
max_area := 0
length := len(arr)
for i:= 0; i<length; i++ {
width := arr[i]
for j:=i+1; j<length; j++ {
if width > arr[j] {
width = arr[j]
}
area = width * (j-i)
if max_area < area {
max_area = area;
}
}
}
fmt.Println(max_area)
}
时间复杂度 O(n^2);