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;
}