58 C Trees
問題
長さnの数列a[i]が与えられる。
a[i]を、a[1]=a[n], a[2]=a[n-1], a[3]=a[n-2],……かつ、
a[2]=a[1]+1, a[3]=a[2]+1, ……を満たすように変えたい。
変更する項の数のを最小にするとき、変更する項の数を求めよ。
制約条件
- 変更後の各項は自然数
- n≦10^5
- a[i]≦10^5
解法
初項を決めると数列は1通りに定まる。
初項がkであるような数列に一致する項の数をcnt[k]とする。
n-(cnt[k]の最大値)を求めれば、変更すべき項の数がわかる。
int n,a,cnt[100001]; void run(){ cin>>n; memset(cnt,0,sizeof(cnt)); rep(i,n){ cin>>a; if(i<(n+1)/2)if(0<a-i&&a-i<100001)cnt[a-i]++; if(i>=(n+1)/2)if(0<a+i+1-n&&a+i+1-n<100001)cnt[a+i+1-n]++; } cout<<n-*max_element(cnt,cnt+100001)<<endl; }