选区间
选区间
题目描述
给定一个数组序列,需要求选出一个区间,使得该区间是所有区间中经过如下计算的值最大的一个:
区间中的最小数*区间所有数的和
最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [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 协议 ,转载请注明出处!