題目
將某個序列中內的每個元素都設為相同的值的最短次數
1.差分數組(后面的減去前面的值存儲的位置可以理解為中間)
差分數組用于處理序列中的區間更新和查詢問題。它存儲序列中相鄰元素之間的差值,而不是直接存儲每個元素的值
怎么對某一段區間的值增加X
利用差分數組的特性來實現對某個區間 [L, R] 內的每個元素增加一個值 X 的操作。
差分數組存儲的是每個元素與其前一個元素之間的差值。
在區間的起始位置 L 處將差分數組增加 X,相當于將該區間后面的所有元素都增加了 X。
然后,在區間的結束位置 R+1 處將差分數組減去 X,以抵消掉對后續元素的影響。這樣就實現了對整個區間內每個元素增加 X 的操作。
2. 解決方案思路
在差分數組中,可以執行兩種操作:對于正數和負數構成的區間,可以對區間內的每個值增加或減少一個數來實現值相同;(本質上是一種相互抵消)
對于那些無法配對的正數或負數,可以考慮將當前位置與超出序列范圍的位置進行操作,相當于是右邊的區間內所有值都受到影響。
基于這個思路,我們可以通過統計序列中正數和負數的個數,通過第一種操作將它們抵消,然后通過第二種操作將剩余的正數或負數變成 0,從而實現所有值相同的目標。
在這個問題中,實際上是要求找到序列中正數或負數的最大值,以確定最少的調整次數,使得所有值相同。(注意這里不是正負數的個數,而是正負數里面的最大值)
3. 解決方案
.
def main():n = int(input())a=[]for i in range(n):a.append(int(input()))passsub = [0] * (n+1)num1 = 0num2 = 0for i in range(1,n):sub[i] = a[i] - a[i - 1]if sub[i] > 0:num1 += sub[i] else:num2 += sub[i]print(max(num1, -num2))if __name__ == '__main__':main()