这是一个贪心问题,可以通过以下步骤解决:
- 关键发现:要使数组不是好数组,就要破坏所有长度为3的非降序子数组对于连续的三个数 a[i-1], a[i], a[i+1]:如果 a[i] >= a[i-1] 且 a[i] <= a[i+1],这就是一个非降序子数组我们必须修改中间的数 a[i] 来破坏这个非降序关系修改完一个位置后,可以跳过下一个位置(因为已经破坏了包含它的所有长度为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; }