/\/\/\/(一个脑筋急转弯?)

题目描述

当满足以下条件时,序列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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tang_7777777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值