求条(站外题)
  • 板块学术版
  • 楼主511_Juruo_wyk
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/3 19:43
  • 上次更新2024/10/3 21:27:25
查看原帖
求条(站外题)
1025958
511_Juruo_wyk楼主2024/10/3 19:43

众所周知安博士开了一个羊腿小店,这天店里还剩下nn只羊腿,其中有 LL 只左腿和 RR 只右腿

安博士决定搞个促销活动,买一只羊左腿配一只羊右腿可以打折!这样就可以让羊腿卖的快点一点,早点卖完早点收工

但是顾客总是挑剔的,他们在选择左腿和右腿时,必须要保证这两只腿出自同一品种的羊,否则他们会不高兴购买

安博士自然是知道自己这 nn 只羊腿分别出自哪个品种的羊——第 ii 只羊腿出自 aia_i 编号品种的羊

但是安博士的技术手段总是那么的高超,他可以通过一次手术让某只羊腿发生变化,可以发生的变化有三种:

  1. 让编号为 ii 的羊腿品种变成 xx

  2. 让编号为 ii 的羊腿从左腿变成右腿

  3. 让编号为 ii 的羊腿从右腿变成左腿

一次手术只能让一只羊腿发生其中一种变化(可以对一只羊腿进行多次手术)

现在安博士想知道,至少需要多少次手术,可以让他现有的 nn 只羊腿成功配上对?

P.S. 这里的配对是指,同一品种的一只左腿和一只右腿配对


第一行输入 n,L,Rn,L,R,表示羊腿总数、左腿数、右腿数(nn 为偶数且 L+R=nL+R=n

第二行前 LL个数表示左腿的种类,后RR个数表示右腿

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;
}
2024/10/3 19:43
加载中...