这个稍微想想就会发现可以这么做
枚举每一个数当作正确序列的一点,就可以知道此时序列有多少需要改变
这样枚举,检验是的
考虑只检验第一个数,那么后续的每一个数为了迎合第一个数都有一个预期值
那么对于以第一个数作为标准来算,所有需要与预期值相差为才是正确的
那么当检验第二个数时,如果比预期值大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; }