漂亮的树

题目描述

街上有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 <= a
i
<= 100,000)。

输出描述:

输出一个整数表示最少修改树的高度的数目。
示例1

输入

3
2 2 2

输出

1
示例2

输入

4
1 2 2 1

输出

0

对于在一个集合里的元素aii是相同的。因此我们统计一下对于每个值aii的数量。对于后半段的数字也是类似的操作。然后我们找这些数量的最大值maxnmaxnn−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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值