众所周知安博士开了一个羊腿小店,这天店里还剩下n只羊腿,其中有 L 只左腿和 R 只右腿
安博士决定搞个促销活动,买一只羊左腿配一只羊右腿可以打折!这样就可以让羊腿卖的快点一点,早点卖完早点收工
但是顾客总是挑剔的,他们在选择左腿和右腿时,必须要保证这两只腿出自同一品种的羊,否则他们会不高兴购买
安博士自然是知道自己这 n 只羊腿分别出自哪个品种的羊——第 i 只羊腿出自 ai 编号品种的羊
但是安博士的技术手段总是那么的高超,他可以通过一次手术让某只羊腿发生变化,可以发生的变化有三种:
让编号为 i 的羊腿品种变成 x
让编号为 i 的羊腿从左腿变成右腿
让编号为 i 的羊腿从右腿变成左腿
一次手术只能让一只羊腿发生其中一种变化(可以对一只羊腿进行多次手术)
现在安博士想知道,至少需要多少次手术,可以让他现有的 n 只羊腿成功配上对?
P.S. 这里的配对是指,同一品种的一只左腿和一只右腿配对
第一行输入 n,L,R,表示羊腿总数、左腿数、右腿数(n 为偶数且 L+R=n)
第二行前 L个数表示左腿的种类,后R个数表示右腿
My code:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int a[N],n,L,R,ans,m;
int l[N],r[N],tl[N],tr[N];
int ll,rr;
int main(){
// freopen("1.in","r",stdin);
cin>>n>>L>>R;
for(int i=1;i<=L;i++){
scanf("%d",&l[i]);
m=max(m,l[i]);
tl[l[i]]++;
}
for(int i=1;i<=R;i++){
scanf("%d",&r[i]);
m=max(m,r[i]);
tr[r[i]]++;
}
for(int i=1;i<=m;i++){
if(tl[i]>tr[i]){
ans+=tl[i]-tr[i]>>1;
ll+=(tl[i]-tr[i])%2;
}
if(tl[i]<tr[i]){
ans+=tr[i]-tl[i]>>1;
rr+=(tr[i]-tl[i])%2;
}
}
ans+=min(ll,rr);
ans+=abs(ll-rr);
cout<<ans;
return 0;
}