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