这是一个贪心问题,可以通过以下步骤解决:

  1. 关键发现:要使数组不是好数组,就要破坏所有长度为3的非降序子数组对于连续的三个数 a[i-1], a[i], a[i+1]:如果 a[i] >= a[i-1] 且 a[i] <= a[i+1],这就是一个非降序子数组我们必须修改中间的数 a[i] 来破坏这个非降序关系修改完一个位置后,可以跳过下一个位置(因为已经破坏了包含它的所有长度为3的非降序子数组)
  2. 贪心策略:从左到右遍历数组当找到一个非降序的三元组时:修改中间的数跳过下一个位置(因为已经不可能形成非降序子数组)统计需要修改的次数
  3. 具体步骤:遍历数组中的每个位置 i(从1到n-2)检查 a[i-1], a[i], a[i+1] 是否构成非降序如果是,则需要修改 a[i],并跳过 i+1
#include <bits/stdc++.h>

using ll = long long;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int n;
    std::cin >> n;
    std::vector<int> a(n);
    for (int &x : a) {
        std::cin >> x;
    }

    std::vector<int> b(n);
    int ans = 0;
    for (int i = 1; i < n - 1; i++) {
        if (a[i] >= a[i - 1] && a[i] <= a[i + 1]) {
            ans++;
            i += 1;  // 跳过下一个位置
        }
    }

    std::cout << ans << "\n";
    return 0;
}