---
# System prepended metadata

title: Codeforces Round 786 (Div. 3) E(枚舉+數論)
tags: [' 數論', 題解, ' 枚舉']

---

---
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()
```