Description
街上有 n n n棵树,标号为 1... n 1...n 1...n,第 i i i棵树的高度为 a i a_i ai。
定义这 n n n棵树是漂亮的,当且仅当
1. 1. 1.对于所有的 i i i, a i = a n − i + 1 a_i=a_{n-i+1} ai=an−i+1;
2. 2. 2.对于 1 ≤ i < ⌊ n 2 ⌋ 1\le i < \lfloor\frac{n}{2}\rfloor 1≤i<⌊2n⌋ (不是整除), a i + 1 = a i + 1 a_i + 1= a_{i + 1} ai+1=ai+1;
比如说 “ 23455432 ” “2 3 4 5 5 4 3 2” “23455432”和 “ 12321 ” “1 2 3 2 1” “12321”是漂亮的而 “ 1331 ” “1 3 3 1” “1331”和 “ 1231 ” “1 2 3 1” “1231”不是。
现在请问最少修改几棵树的高度(可以变大也可以变小),使得这些树是漂亮的。
Input
第一行一个整数 n n n表示树的数量
第二行 n n n个整数表示树的高度
( 1 ≤ n , a i ≤ 1 0 5 ) (1\le n,a_i\le 10^5) (1≤n,ai≤105)
Output
输出一个整数表示最少修改树的高度的数目。
Sample Input
3
2 2 2
Sample Output
1
Solution
a 1 , . . . , a n a_1,...,a_n a1,...,an的标准形式为 1 , 2 , . . . , ⌈ n 2 ⌉ , . . . , 2 , 1 1,2,...,\lceil\frac{n}{2}\rceil,...,2,1 1,2,...,⌈2n⌉,...,2,1,每个 a i a_i ai减去其标准值,所得序列的众数的数量即为与标准序列的最大匹配,剩余数字则需要调整
Code
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,a[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
int j=i;
if(j>n/2)j=n+1-i;
a[i]-=j;
}
sort(a+1,a+n+1);
int mx=0;
for(int i=1;i<=n;)
{
int j=i;
while(j<=n&&a[i]==a[j])j++;
mx=max(mx,j-i);
i=j;
}
printf("%d\n",n-mx);
return 0;
}