美团240309春招实习笔试真题解析2——小美的数组询问

小美的数组询问

小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。
现在小美想知道,如果那些未知的元素在区间[l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?
共有q次询问。

输入描述
第一行输入两个正整数n,q,代表数组大小和询问次数。
第二行输入n个整数ai,其中如果输入ai的为 0,那么说明ai是未知的。
接下来的q行,每行输入两个正整数l,r,代表一次询问。
1<=n,q<=10^5
0<=ai<=10^9
1<=l<=r<=10^9

输出描述
输出q行,每行输出两个正整数,代表所有元素之和的最小值和最大值。

示例 1
输入
3 2
1 0 3
1 2
4 4
输出
5 6
8 8
说明
只有第二个元素是未知的。
第一次询问,数组最小的和是 1+1=3=5,最大的和是 1+2+3=6。
第二次询问,显然数组的元素和必然为 8。

这个问题可以通过模拟来解决。我们可以遍历每个查询,对于每个查询,我们尝试将未知的元素在区间[l,r]内的所有可能取值计算出来,并计算数组的最小和和最大和。

具体步骤如下:

  1. 遍历每个查询,对于每个查询,遍历区间[l,r]内的所有位置,将未知的元素替换为区间内的每个可能的值。
  2. 计算替换后的数组的和,并更新最小和和最大和。
  3. 输出每次查询的最小和和最大和。

下面是相应的Python代码:

def calculate_sum(arr, l, r):
    total = 0
    for i in range(l, r+1):
        total += arr[i]
    return total

def min_max_sum(n, q, arr, queries):
    min_sums = []
    max_sums = []
    
    for query in queries:
        l, r = query
        min_sum = float('inf')
        max_sum = 0
        
        # 遍历区间[l,r]内的所有位置
        for i in range(l-1, r):
            # 如果当前位置的元素是未知的,则尝试将其替换为区间[l,r]内的每个可能的值
            if arr[i] == 0:
                for j in range(l, r+1):
                    arr[i] = j
                    cur_sum = calculate_sum(arr, l-1, r-1)
                    min_sum = min(min_sum, cur_sum)
                    max_sum = max(max_sum, cur_sum)
                arr[i] = 0  # 恢复为未知状态
            else:
                cur_sum = calculate_sum(arr, l-1, r-1)
                min_sum = min(min_sum, cur_sum)
                max_sum = max(max_sum, cur_sum)
        
        min_sums.append(min_sum)
        max_sums.append(max_sum)
    
    return min_sums, max_sums

# 读取输入
n, q = map(int, input().split())
arr = list(map(int, input().split()))

queries = []
for _ in range(q):
    l, r = map(int, input().split())
    queries.append((l, r))

# 计算最小和和最大和
min_sums, max_sums = min_max_sum(n, q, arr, queries)

# 输出结果
for min_sum, max_sum in zip(min_sums, max_sums):
    print(min_sum, max_sum)

将输入和输出与示例进行比较。

n,q = map(int, input().split())
A = [int(c) for c in input().split()]

zeros = A.count(0)
sum_ = sum(A)
for _ in range(q):
    l,r = map(int, input().split())
    print(sum_ + zeros*l, sum_ + zeros*r)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值