题目
原题链接:点击这里
题目大意:给定若干只有颜色的左右袜子,左右互变,或者变颜色,代价都是1,求全部都是匹配的最小花费
思路
比赛时候的模拟后的第一反应的错误思路:优先变颜色
问过扣巨后的正确思路:
中途自己写这个代码的时候,一直出bug,就是因为没有分清楚sum1和mp1.size(),显然sum1比mp1.size大的多,因为mp1中的value可以大于1,所以还是想清楚在写
代码实现
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define el '\n'
#define cl putchar('\n')
#define pb push_back
#define fir first
#define sec second
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vci;
typedef map<int,int> mii;
typedef mii::iterator mii_it;
typedef mii::reverse_iterator mii_rit;
const int N=1e5+10,M=1e3+10;
int T,n,m,x,y,k,l,r,ans,sum1,sum2;
int a[N];
//左右袜子颜色配对
void work(mii &mp1,mii &mp2){
y=(sum2-sum1)/2;
x=0;
// cout<<"y="<<y<<el;
for(auto &i:mp2){
if(i.sec>=2){
k=i.sec/2;
if(k>=y){
ans+=y;
i.sec-=2*y;
y=0;
}
else {
i.sec-=k*2;
ans+=k;
y-=k;
}
}
if(!y)break;
}
if(y){
ans+=y*2+sum1;
}
else {
ans+=sum1;
}
}
int main() {
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--) {
ans=0;
cin>>n>>l>>r;
sum1=sum2=0;
mii mpl,mpr;
for(int i=1;i<=l;i++){
cin>>x;
mpl[x]++;
}
for(int i=1;i<=r;i++){
cin>>x;
mpr[x]++;
}
sum1=l;
sum2=r;
for(auto &i:mpl){
if(mpr[i.fir]){
if(mpr[i.fir]>i.sec){
mpr[i.fir]-=i.sec;
sum2-=i.sec;
sum1-=i.sec;
i.sec=0;
}
else {
i.sec-=mpr[i.fir];
sum1-=mpr[i.fir];
sum2-=mpr[i.fir];
mpr[i.fir]=0;
}
}
}
// cout<<sum1<<" "<<sum2<<el;
if(sum1==sum2){
ans=sum1;
}
else {
if(sum1<sum2){
work(mpl,mpr);
}
else {
swap(sum1,sum2);
work(mpr,mpl);
}
}
cout<<ans<<el;
}
}