题目描述
给出一个数组,不管开始满足什么特性,需将其改成数组中每一个元素左右两边的元素相等,并且两边的元素与中间元素不相等。例如 {1,3,1,3,1}、{2,4,2,4}即为满足要求的数组,而{1,3,2,1,4}、{2,3,1,4}则需要通过调整才可满足要求。
现给出一个数组,请问最少需要几次操作才可使其成为锯齿数组?
代码
#include<iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int sumdex(vector<int>& hand)
{
unordered_map<int, int> tags_map;
unordered_map<int, int> tags_map_ous;
for (int i = 0; i < hand.size(); i += 2)
{
++tags_map[hand[i]];
}
for (int i = 1; i < hand.size(); i += 2)
{
++tags_map_ous[hand[i]];
}
int min1 = 0;
int dex = 0;
int min2 = 0;
for (auto& a : tags_map)
{
if (min1 < a.second)
{
dex = a.first;
min1 = a.second;
}
}
for (auto& a2 : tags_map_ous)
{
if (a2.first != dex && min2 < a2.second)
{
min2 = a2.second;
}
}
return hand.size() - min1 - min2;
}
int main()
{
int n, tmp;
vector<int> vec;
cin >> n;
while (n--)
{
cin >> tmp;
vec.push_back(tmp);
}
cout << sumdex(vec) << endl;
return 0;
}