top1编程
← 返回题目
题解

【提高】最少的修改次数

1 条题解

  • 0
    @ 2026-7-29 0:18:10
    #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