Try Again

漂亮的树

街上有n棵树,标号为1...n,第i棵树的高度为ai
定义这n棵树是漂亮的,当且仅当
    1. 对于所有的i,ai=an-i+1
    2. 对于1 <= i < n / 2 (不是整除),ai + 1= ai + 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
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
int a[100006],b[200006],c[350006];
int n,m;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    if(n&1) m=n/2+1;
    else m=n/2;
    for(int i=1;i<=m;i++)
        b[i]=i;
    for(int i=m+1;i<=n;i++)
        b[i]=n-i+1;
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++)
        c[a[i]-b[i]+200000]++;
    int ans=0;
    for(int i=0;i<=350000;i++)
        ans=max(ans,c[i]);
    printf("%d\n",n-ans);
    return 0;
}

 

posted @ 2018-04-28 11:14  十年换你一句好久不见  阅读(203)  评论(0编辑  收藏  举报