首页 > 试题广场 >

选区间

[编程题]选区间
  • 热度指数:3908 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

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

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

最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [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
头像 Pandas_007
发表于 2023-10-03 17:52:35
from sys import prefix from itertools import accumulate N = int(input()) arr = list(map(int, input().split())) + [0] res = 0 stack_index = [] prefix_ 展开全文
头像 wywzxxz
发表于 2021-01-23 15:15:14
时间复杂度O(nlogn) 我觉得大家的方案都有点太麻烦了……观察目标函数:区间中的最小数*区间所有数的和第一反应就是按照值从小到大处理点,这样的话区间中的最小数*就已知了,我们只用考虑区间就行。 那么,区间有多大呢?其实题目中又一个很强的约束 区间内的所有数字都在[0, 100]的范围内; 因 展开全文
头像 laglangyue
发表于 2020-06-16 22:10:03
思路1:暴力,计算sum*min 50% 思路2:中心扩展法,把当前作为区间最小值,向两边扩展区间 100% 1400+ ms 思路3:由于数据范围从0-100,分别找出0-100每个数对应的最大和区间(见讨论区大佬),类似查表法 思路4:单调栈(最佳思路) import java.io.Buf 展开全文
头像 17c89
发表于 2023-12-18 13:22:59
import java.util.ArrayDeque; import java.util.Arrays; import java.util.Deque; import java.util.HashMap; import java.util.Map; import java.util.Scanner 展开全文