题目描述

给航天器一侧加装长方形和正方形的太阳能板,需要先安装两个支柱,再在支柱的中间部分固定太阳能板;但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那支支柱的长度。
现提供一组整型数组的支柱高度数据,假设每个支柱间的距离相等为一个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。

输入描述

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);