漂亮的树 算法

题目链接:漂亮的树

引入一个标准漂亮树(1,2,3,4,5,4,3,2,1)概念,问题就简化了。

题目:

题目描述 
街上有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 <= ai <= 100,000)。
输出描述:
输出一个整数表示最少修改树的高度的数目。
示例1
输入

3
2 2 2
输出

1
示例2
输入

4
1 2 2 1
输出

0
#include <iostream>
#include <map>
//tdw
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	if (n > 0)
	{
		int* pA = new int[n+1];//0跳过,方便计算
		int index = 0;
		while (index < n)
		{
			cin >> pA[++index];//输入数据
		}

		int* pStandard = new int[n+1];//标准的漂亮树(1,2,3,4,5,4,3,2,1),同样不包含0   
		for (int i = 1;i <= (n+1)/2;++i)
		{
			pStandard[i] = i;
			pStandard[n - i + 1] = i;
		}
		
		map<int, int> mapDifValue;//key-差值,value-该差值下的数量       (样品树列与标准漂亮树的差值。差值最多一样的树不需要修改,其他的都需要修改)
		int dif = 0;
		for (int i = 1; i <= n;++i)
		{
			dif = pA[i] - pStandard[i];//差值
			map<int, int>::iterator iter = mapDifValue.find(dif);
			if (iter == mapDifValue.end())
				mapDifValue.insert(make_pair(dif, 1));
			else
				++iter->second;
		}

		map<int, int>::iterator iter = mapDifValue.begin();
		int maxCorrect = 0;//存在差值一样的最多的个数
		for (;iter != mapDifValue.end();++iter)
		{
			if (maxCorrect < iter->second)
				maxCorrect = iter->second;
		}
		cout << (n - maxCorrect);//需要修改的树
		delete[] pA;
		delete[] pStandard;
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值