选区间

选区间

题目描述

给定一个数组序列,需要求选出一个区间,使得该区间是所有区间中经过如下计算的值最大的一个:

区间中的最小数*区间所有数的和

最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式,可得到所有可以选定各个区间的计算值:

[6] = 6 * 6 = 36;

[2] = 2 * 2 = 4;

[1] = 1 * 1 = 1;

[6,2] = 2 * 8 = 16;

[2,1] = 1 * 3 = 3;

[6, 2, 1] = 1 * 9 = 9;

从上述计算可见选定区间[6],计算值为36, 则程序输出为36。

区间内的所有数字都在[0, 100]的范围内;

输入描述:

第一行输入数组序列个数,第二行输入数组序列。

输出描述:

输出数组经过计算后的最大值。

示例1

输入

3
6 2 1

输出

36

思路:

把每个数当成最小数,从左到右遍历

代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
    int n,max=-1,sum,res;
    scanf("%d",&n);
    int num[n+1];
    int numSum[n+1];
    for (int i=1;i<=n;i++){
        scanf("%d",&num[i]);
    }
    for(int i=1;i<=n;i++){
        for(int j=i;j>=1;j--){
            if (num[j]>=num[i]){
                sum +=num[j];
            }else{
                break;
            }
        }
        for(int j=i+1;j<=n;j++){
            if (num[j]>=num[i]){
                sum +=num[j];
            }else{
                break;
            }
        }
        res = num[i]*sum;
        sum = 0;
        if (max <res){
            max = res;
        }
    }
    printf("%d",max);
}

代码效率:

运行时间:1038ms, 超过19.45%用C++提交的代码
占用内存:3472KB, 超过39.60%用C++提交的代码


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!