题目描述
定义这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)。i
第二行n个整数表示树的高度( 1 <= a
<= 100,000)。
输出描述:
输出一个整数表示最少修改树的高度的数目。
输入
3 2 2 2
输出
1
输入
4 1 2 2 1
输出
0
对于在一个集合里的元素ai−i是相同的。因此我们统计一下对于每个值ai−i的数量。对于后半段的数字也是类似的操作。然后我们找这些数量的最大值maxnmaxn。n−maxn就是答案。
1 #include<bits/stdc++.h>
2 #define clr(x) memset(x,0,sizeof(x))
3 #define clr_1(x) memset(x,-1,sizeof(x))
4 #define mod 1000000007
5 #define LL long long
6 #define INF 0x3f3f3f3f
7 using namespace std;
8 const int N=1e5+10;
9 const int P=1e5;
10 int n,m;
11 int ans;
12 int a[N];
13 int high[N*2];
14 int main()
15 {
16 scanf("%d",&n);
17 for(int i=1;i<=n;i++)
18 scanf("%d",a+i);
19 m=(n+1)/2;
20 for(int i=1;i<=m;i++)
21 {
22 high[P+a[i]-i]++;
23 }
24 for(int i=m+1;i<=n;i++)
25 {
26 high[P+a[i]-(n-i+1)]++;
27 }
28 ans=0;
29 for(int i=1;i<=2*P;i++)
30 ans=max(ans,high[i]);
31 printf("%d\n",n-ans);
32 return 0;
33 }