Newcoder 84 B.漂亮的树(贪心)

142 篇文章 0 订阅

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=ani+1

2. 2. 2.对于 1 ≤ i &lt; ⌊ n 2 ⌋ 1\le i &lt; \lfloor\frac{n}{2}\rfloor 1i<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) (1n,ai105)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值