街上有n棵树,标号为1…n,第i棵树的高度为a
i。
定义这n棵树是漂亮的,当且仅当
1. 对于所有的i,a
i=a
n-i+1;
2. 对于1 <= i < n / 2 (不是整除),a
i + 1= a
i + 1;
比如说 “2 3 4 5 5 4 3 2”和“1 2 3 2 1”是漂亮的而“1 3 3 1”和“1 2 3 1”不是。
现在请问最少修改几棵树的高度(可以变大也可以变小),使得这些树是漂亮的。
输入描述:
第一行一个整数n表示树的数量( 1 <= n <= 100,000)。 第二行n个整数表示树的高度( 1 <= ai <= 100,000)。
输出描述:
输出一个整数表示最少修改树的高度的数目。
思路:对每棵树的高度减去下标,看哪个高度出现次数最多就保留
/*
思维
满足条件的序列,ai-i相同
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
int a[MAXN];
map<int,int> mp;
int main(){
int n; cin>>n;
for (int i=0; i<n; i++) cin>>a[i];
int m=(n+1)/2;
for (int i=0; i<m; i++) a[i]-=i;
for (int i=m; i<n; i++) a[i]-=n-i-1;
for (int i=0; i<n; i++) mp[a[i]]++;
int ans=0;
for (map<int,int>::iterator it=mp.begin(); it!=mp.end(); it++)
ans=max(ans,it->second);
cout<<n-ans<<endl;
return 0;
}