题目链接:CF58C Trees
(CF)上(1800)的题。
可以用桶来计数,设(b[i])为第一个数为(i)时合法的数的个数,显然这个是可以(mathcal O(1))直接算的,然后就做完了。
一些我犯的(SB)错误:
(1.)正整数序列没看到正。
(2.)注意(b)的非一值不一定只到(n),要循环到到(1e5)。
......
然后做得我懵逼至极,总体上说这道题还是比较考思维的,能做出来很不错了......
时间复杂度是(mathcal O(n)),可以通过本题。
(Code):
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 100005
int a[MAXN];
int b[MAXN];
int n,maxn=0;
int main()
{
#define read(x) scanf("%d",&x)
read(n);
for(int i=1;i<=n;i++) read(a[i]);
int mid=n%2==1?n/2+1:n/2;
for(int i=1;i<=mid;i++) if(a[i]+1-i>0) b[a[i]+1-i]++;
for(int i=mid+1;i<=n;i++) if(a[i]+i-n>0) b[a[i]+i-n]++;
for(int i=1;i<=100000;i++) maxn=max(maxn,b[i]);
printf("%d
",n-maxn);
return 0;
}
当然要对左半部分和右半部分分别计算。