Codeforces 1515 B

发布时间 2023-06-08 17:31:27作者: Liang2003

1515 B

题意

有n只袜子(n为偶数),但左袜子有L只,右袜子有R只,每只袜子的颜色为\(C_i\),可以进行以下操作:换袜子的方向、或者将袜子变色,问进行多少次操作后变成(n/2)对袜子

思路

很曲折,想了很久后终于想清楚,排除配对的袜子后,对于某类袜子\(i\),剩下\(c \geq 2\) (假设剩下的是右边)只,它的配对情况要分类讨论:如果总体的右袜子多于左边,那么它可以变换一只袜子的方向配成一对,否则不能变换,举个例子,\(r_1=2,r_2=1,r_3=1\),如果直接将1袜子变换方向配对,那么总花费为3,实际上最少花费为2.

代码

void solve() 
{
	cin>>n>>L>>R;
	for(int i=1;i<=n;i++) l[i]=r[i]=0;
	for(int i=1,x;i<=n;i++) 
	{
		cin>>x;
		if(i<=L) l[x]++;
		else r[x]++;
	}
	int ans=0;
	for(int i=1;i<=n;i++) 
	{
		int x=min(l[i],r[i]);
		l[i]-=x,r[i]-=x;
		L-=x,R-=x;
	}
	for(int i=1;i<=n;i++) 
	{
		while(l[i]>=2&&L>R) 
		{
			l[i]-=2;
			ans++;
			L-=2;
		}
		while(r[i]>=2&&R>L) 
		{
			r[i]-=2;
			ans++;
			R-=2;
		}
	}
	ans+=min(L,R) + abs(L-R);
	cout<<ans<<endl;
}