Trees CodeForces - 58C

原题链接
考察:思维
思路:
  属于同一数列的点与基准点位置无关.比如 \(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;
}

posted @ 2021-09-12 09:44  acmloser  阅读(26)  评论(0编辑  收藏  举报