这个稍微想想就会发现可以这么做

枚举每一个数当作正确序列的一点,就可以知道此时序列有多少需要改变

这样枚举,检验是

考虑只检验第一个数,那么后续的每一个数为了迎合第一个数都有一个预期值

那么对于以第一个数作为标准来算,所有需要与预期值相差为才是正确的

那么当检验第二个数时,如果比预期值大1,说明需要比预期值大才行

所以,可以开一个来保存第一个数的预期值,然后一直取即可

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn],b[maxn],vis[maxn],n;
map<int,int>mp;
int main()
{
    cin >> n;
    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);
    int ans=n,k=a[1],temp=1;
    mp[0]++;
    for(int i=2;i<=n;i++)
    {
        k+=i-1;
        b[i]=k;
        mp[k-a[i]]++;
    }
    ans=min(ans,n-mp[0]);
    for(int i=2;i<=n;i++)
    {
        ans=min( ans,n-mp[b[i]-a[i]]);
    }
    cout << ans;
}