题目描述
当满足以下条件时,序列a1,a2,...,ana1,a2,...,an被称为 /\/\/\/ :
- 对于每个 i=1,2,...,n−2i=1,2,...,n−2 , ai=ai+2ai=ai+2 。
- 序列中正好出现两个不同的数字。
现在给出一个长度为nn的数组,保证nn为偶数。 我们想通过替换它的一些元素来使这个序列 /\/\/\/ 。 找出需要替换的最少元素数。
输入格式
第一行一个正偶数nn,代表数字数量。
第二行nn个正整数aiai
2≤n≤1052≤n≤105
1≤ai≤1051≤ai≤105
输出格式
一个正整数,代表最少需要替换多少个数字。
样例输入
样例1: 4 3 1 3 2 样例2: 6 105 119 105 119 105 119 样例3: 4 1 1 1 1
样例输出
样例1: 1 样例2: 0 样例3: 2
提示
对于样例的解释:
样例1可替换为3 1 3 1
样例2无需替换
样例3,要求数组中有两个不同的数字
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
int e[100010];//原数组
int p[100010];//奇数数组
int o[100010];//偶数数组
int jmax[100010];
int omax[100010];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)//依次存入原数组
{
cin>>e[i];
}
for(int i=1;i<=n;i++)//进行奇偶分类处理
{
if(i%2==0)//偶数
{
o[e[i]]++;//存入偶数数组对应位置出现次数+1
}
else//奇数
{
p[e[i]]++;//存入奇数数组对应位置出现次数+1
}
}
int oma=0;
for(int i=1;i<=100010;i++)
{
if(o[i]>o[oma])
{
oma=i;
}
}
int jma=0;
for(int i=1;i<=100010;i++)
{
if(p[i]>p[jma])
{
jma=i;
}
}
cout<<jma<<" "<<oma<<endl;
sort(o+1,o+100000+1);
int om=o[100000];//这是偶数最大的数
sort(p+1,p+100000+1);
int jm=p[100000];//这个是奇数最大的数
if(jma!=oma)//如果两个出现最多的数不相等的话就直接减就行了
{
int ans=n-jm-om;
cout<<ans;
return 0;
}
else//两个出现数相同接管的就是次多的数
{
int ans1, ans2;
jm=p[99999];
ans1=n-jm-om;//分别计算次多的数哪一个修改次数最少
om=o[99999];
jm=p[100000];
ans2=n-jm-om;//另一个
cout<<min(ans1, ans2);//对比更少执行次数的输出
}
return 0;
}