题目链接:漂亮的树
引入一个标准漂亮树(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;
}