题解
【提高】最少的修改次数
1 条题解
-
0
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 加速输入输出 int n; cin >> n; vector<long long> A(n); // 用long long避免A[i]-i溢出 for (int i = 0; i < n; ++i) { cin >> A[i]; } // 构造B数组:B[i] = A[i] - (i+1) (注意下标从1开始) vector<long long> B(n); for (int i = 0; i < n; ++i) { B[i] = A[i] - (i + 1); } // 贪心+二分求最长非递减子序列长度 vector<long long> tails; for (long long num : B) { // 找第一个大于num的位置(非递减,用upper_bound) auto it = upper_bound(tails.begin(), tails.end(), num); if (it == tails.end()) { tails.push_back(num); } else { *it = num; } } // 最少修改数 = 总长度 - 最长非递减子序列长度 int ans = n - tails.size(); cout << ans << endl; return 0; }
- 1