原题链接
考察:思维
思路:
属于同一数列的点与基准点位置无关.比如 \(2\quad3\quad5\quad3\)
第\(1,2,4\)个数同一数列,所以不论哪个为基准点,其余点都不用修改.可以发现这些数-位置\(i\)的差相同(\(i<=mid\)).因此求出最多不用修改的点,就是答案.
Code
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 100010;
int n,a[N];
int vis[N];
void solve()
{
int mid = n/2+n%2,ans = 0;
//不需要改变的 地方与枚举的地方无关.
for(int i=1;i<=mid;i++)
if(a[i]-i>=0) vis[a[i]-i]++;
for(int i=n;i>mid;i--)
if(a[i]-(n-i+1)>=0) vis[a[i]-(n-i+1)]++;
//vis为不需要修改的次数
for(int i=0;i<=N-10;i++)
ans = max(vis[i],ans);
printf("%d\n",n-ans);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
solve();
return 0;
}