C:迷途之家的大贤者(二)

思路:

  • 先对 a、b 中的数计数;
  • 再分别在 a、b 里面找相同的数的个数,因为两个数组里相同的数一定要删掉,而且一次只能删一个;
  • 然后判断哪个数组里面相同的数更少,(这里假设 a 更多,b 更少)更少的数组(b)再删除 a 中有,b 中也有的数;
  • 最后再找两个数组里有相同的数的对数,这里只需要 cnt/2 向上取整就好了,因为可以交叉删除,使得a中没有但是b中有...

题外话:

本人太菜赛时思路太混乱没有A出这题,打完回寝室的路上听同学讲了他的思路才确定方向,然后回去洗完澡还没补完这题又打cf去了,中午A了但是没时间写题解因为下午上课所以午休去了,上完课赶紧回来写题解

//		https://ac.nowcoder.com/acm/contest/95928/C

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAX=1e9+7;

int t,n,m;
void solve(){
	cin>>n;
	map<int,int>ma,mb;//计数用的
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		ma[x]++;
	}
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		mb[x]++;
	}
	int cnta=0,cntb=0;//记录a、b中有多少个相同的数,每种数的个数-1,就是必须要操作的次数
	for(auto& it:ma)if(it.second>1)cnta+=it.second-1,it.second=1;
	for(auto& it:mb)if(it.second>1)cntb+=it.second-1,it.second=1;
	if(cnta>cntb)//a里面的数更多
	{
		int temp=cnta-cntb;//多多少个
		for(auto& it:ma)//在b中删除b里面有,a中也有的数
		{
			if(mb[it.first]>0)
				mb[it.first]--,temp--;
			if(temp==0)break;
		}
	}
	else if(cnta<cntb)//b里面的数更多
	{
		int temp=-cnta+cntb;
		for(auto& it:mb)//在a中删除a里面有,b中也有的数
		{
			if(ma[it.first]>0)
				ma[it.first]--,temp--;
			if(temp==0)break;
		}
	}
	int cnt=0;
	for(auto& it:ma)//再看看两个数组里还有哪些相同的数,操作次数只需要cnt/2向上取整就好了
	{
		if(mb[it.first]>0 && it.second>0)
			cnt++,mb[it.first]--,it.second--;
	}
	cout<<max(cnta,cntb)+(cnt+1)/2<<endl;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}