---
title: "Codeforces Round 786 (Div. 3) E(枚舉+數論)"
tags: 題解, 枚舉, 數論
---
https://codeforces.com/contest/1674/problem/E
#### 題意
有一個長度 $N$、正整數的數組 $A$,每次操作可以選擇一個位置 $i$,將 $A[i]$ 扣掉 $2$ 且 $A[i-1]$、$A[i+1]$ 若存在的話各自可以扣掉 $1$。元素被扣到零後如果再被扣則會保持為零,且已經是零的元素仍然可以被選擇。
求最少要幾次操作可以將數組中至少兩個元素都扣到零。
#### 思路
觀察發現這兩個被扣到零的元素,其位置關係有三種可能:
1. 距離 $>=3$
2. 距離 $=2$,即間隔一個元素
3. 距離 $=1$,即它們兩個是相鄰的
方案一的答案就是兩個最小元素各自扣到零所需的操作。
方案二可以先選中間位置操作,直到較小的變成零,剩餘較大的那個可以用扣 $2$ 的操作。
方案三則是每次選兩個中較大的那個,直到兩者都變成零。簡單來說就是先選擇大的那個,直到兩者變成一樣;接下來輪流選擇它們,每次會扣掉 $2+1=3$,直到扣完即可。
#### Code
```python=1
def solve():
N = int(input())
A = list(map(int, input().split()))
mn = min(A)
mn_i = A.index(mn)
A[mn_i] = INF
mn2 = min(A)
A[mn_i] = mn
ans = (mn + 1) // 2 + (mn2 + 1) // 2
for i in range(1, N - 1):
mn, mx = min(A[i - 1], A[i + 1]), max(A[i - 1], A[i + 1])
ans = min(ans, mn + (mx - mn + 1) // 2)
for i in range(N - 1):
mn, mx = min(A[i], A[i + 1]), max(A[i], A[i + 1])
diff = mx - mn
if mn >= diff:
cur = diff
mx -= 2 * diff
mn -= diff
cur += (mn + mx + 2) // 3
else:
cur = mn
mx -= 2 * mn
mn -= mn
cur += (mx + 1) // 2
ans = min(ans, cur)
print(ans)
if __name__ == "__main__":
solve()
```