首页 > 试题广场 >

编程题2

[编程题]编程题2
  • 热度指数:11043 时间限制:C/C++ 3秒,其他语言6秒 空间限制: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]的范围内;


输入描述:
第一行输入数组序列长度n,第二行输入数组序列。
对于 50%的数据,  1 <= n <= 10000;
对于 100%的数据, 1 <= n <= 500000;


输出描述:
输出数组经过计算后的最大值。
示例1

输入

3
6 2 1

输出

36
'''
为什么我这个跑出来是0,然后他给我的
用例输入
10
81 87 47 59 81 18 25 40 56 0 
预期输出
16685                这个预期输出结果是错的吧,并不是最大值啊,
                          我看了一下这个结果的区间是[81, 87, 47, 59, 81]  ——> 47*(81+87+47+56+81)
实际输出
20384              而我这个区间是[81, 87, 59, 81, 56]  ——>  56*(81+87+59+81+56)
                         这个才是最大值吧,还是说我理解错了
我的理解是给定数组,分别按公式求所有非空子集的列表最小值✖列表所有元素之和,然后输出最大值。
有大佬能看看我的理解正确吗?
'''
import itertools
def generate_subsets(nums):
    subsets = []
    for r in range(1, len(nums) + 1):
        subsets.extend(list(itertools.combinations(nums, r)))
    return [list(subset) for subset in subsets]
n = int(input())
numbers = list(map(int, input().split(' ')[:n]))
subsets = generate_subsets(numbers)
product_sums = []
for subset in subsets:
    product_sums.append(min(subset) * sum(subset))
maximum_product_sum = max(product_sums)
print(maximum_product_sum)
编辑于 2023-11-23 15:48:05 回复(0)
# python跑的也太慢了!!同样的算法,C++能通过,python只能跑完70%就超时了

n = eval(input())
nums = list(map(int,input().split()))



max_ = 0

for i in range(100,0,-1):
    summ = 0
    minimum = i
    for j in range(n):
        if nums[j] < i:
            max_ = max(max_, summ*minimum)
            summ = 0
            minimum = i 
        else:
            summ += nums[j]
            minimum = min(minimum, nums[j])
    
print(max_)

发表于 2020-07-03 21:27:51 回复(0)

python3测试通过
耗时间的应该是取每个最小值的时候,需要停止条件设置设置得准确些。当我最小值设置为一个固定数值的时候(就是我给出的min_limit初值),python3通过90%。

import sys


def get_max_prod_ge_n(nums, n):
    res, max_res = 0, 0
    for i in nums:
        if i >= n:
            res += i * n
            max_res = res if res > max_res else max_res
        else:
            res = 0
    return max_res


if __name__ == '__main__':
    len_nums = int(sys.stdin.readline())
    nums = [int(s) for s in sys.stdin.readline().split()]
    max_res = 0

    nums_unique_sorted = sorted(list(set(nums)), reverse=True)
    max_num = nums_unique_sorted[0]
    min_limit = max_num / len_nums

    for i in [i for i in nums_unique_sorted if i >= min_limit]:
        res_i = get_max_prod_ge_n(nums, i)
        if res_i > max_res:
            max_res = res_i
            new_limit = res_i / (max_num * len_nums)
            min_limit = new_limit if new_limit > min_limit else min_limit
        max_res = res_i if res_i > max_res else max_res
    print(max_res)
编辑于 2019-08-23 11:33:04 回复(0)
球球大佬帮我看看为什么提示有语法错误或者数组越界泥 

n = int(input())
l = list(map(int,input().split(' ')))
str = [] for i in range(0,n):  for j in range(i+1,n+1):
       str.append(l[i:j]) 
k = 0 maxdata = 0 while k< len(str):
    sum = 0  mul = 1    for j in str[k]:
        sum += j
    mul = sum * min(str[k]) print(mul)
    maxdata = max(mul,maxdata)
    k += 1 print(maxdata)

编辑于 2019-04-12 21:50:15 回复(4)
用了以下三种方法,通过率分别为20%, 50%, 60%,看来python还是太慢了。。。
n = int(input())
inp = list(map(int, input().split()))
max_num = 0
'''
## brute force method O(n^3)
for i in range(1,n+1):
    for j in range(0,n-i+1):
        temp = min(inp[j:j+i]) * sum(inp[j:j+i])
        if temp > max_num:
            max_num = temp
'''

'''
## O(n^2)
for i in range(n):
    left_index = i
    right_index = i
    while left_index > 0:
        if inp[left_index -1] < inp[i]:
            break
        else :
            left_index -= 1
    while right_index < n-1:
        if inp[right_index +1] < inp[i]:
            break
        else :
            right_index += 1
    temp = min(inp[left_index:right_index+1]) * sum(inp[left_index:right_index+1])
    if temp > max_num:
        max_num = temp
'''
# O(n)
for i in range(0,101):
    min_num = 101
    sum1 = 0
    for j in range(n):
        if inp[j] < i :
            max_num = max(max_num, sum1 * min_num)
            sum1 = 0
            min_num = 101
        else :
            sum1 += inp[j]
            min_num = min(min_num, inp[j])
            
print(max_num)

发表于 2019-02-21 20:26:32 回复(0)
复杂度太大,但不知道怎样改才能减少?请大神们帮忙指导!
number = int(input())
lst = [eval(x) for x in input().split()]

if min(lst)>=0 and max(lst)<=100:
    st = [x*x for x in lst]
    
    leng = len(lst)
    if leng>1:
        n = 2
        while n<=leng:
            i = 0
            while i+n<=leng:
                st.append(sum(lst[i:i+n])*min(lst[i:i+n]))
                i = i + 1     
            n = n + 1

print(max(st)) 
发表于 2018-05-09 19:21:01 回复(0)