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