📅  最后修改于: 2023-12-03 14:58:19.545000             🧑  作者: Mango
本题源自于2011年GATE计算机科学考试。
给定数列$A = {a_1, a_2, ..., a_n}$,以及另一个数列$P = {p_1, p_2, ..., p_n}$,每个$p_i$表示在数列$A$中,$a_i$之后最小的比$a_i$大的数的下标。设$q_i$表示从$a_i$开始,到下标为$p_i$的数(不含$p_i$)之间所有数的和。例如,对于数列$A = {3,1,4,2}$,数列$P = {3,3,4,4}$,则$q_1=4+2=6, q_2=1, q_3=2, q_4=2$。
现在,给定数列$A$和$P$,请写出一个函数sumFromArray(A, P)
,将所有$q_i$的和作为结果返回。
3 1 4 2
3 3 4 4
11
我们可以考虑从前到后遍历整个数列$A$,每找到一个位置$i$,就求出$q_i$并把它加到一个累加器里。具体来说,我们可以先令$s=0$,然后用一个while循环处理每一个位置$i$,直到i>n。循环的主体部分可以写成下面这个样子(其中$p_i$是按照可能空缺的方式处理,保证$p_i ≤ n$):
while i ≤ n do
s += a[i]
i = p[i] + 1
end while
def sumFromArray(A, P):
n = len(A)
s = 0
i = 0
while i < n:
s += A[i]
i = P[i] + 1 if P[i] < n else n
return s
代码片段按markdown标明以供复制或显示:
```python
def sumFromArray(A, P):
n = len(A)
s = 0
i = 0
while i < n:
s += A[i]
i = P[i] + 1 if P[i] < n else n
return s