这题不太难,主要就是在于纸牌转换为数字,剩下的就是基本的匈牙利算法(对这个算法不理解的可以翻我前面的博客)
题目链接 : 点击打开链接
代码注释:
<span style="font-size:18px;color:#ff6600;"><strong>#include<iostream>
#include<cstring>
using namespace std;
#define N 1500
int a[N][N],visit[N],link[N],x[N],y[N]; //x[]存女生的纸牌大小,y[]存男生的
int n;
int dfs(int i)
{
for(int j=0; j<n; j++)
{
if(!visit[y[j]]&&a[i][y[j]]) //把原来的visit[j] 改为 visit[y[j]]
{
visit[y[j]]=1;
if(link[y[j]]==-1||dfs(link[y[j]]))
{
link[y[j]]=i;
return 1;
}
}
}
return 0;
}
int hungary()
{
int sum=0;
memset(link,-1,sizeof(link));
for(int i=0; i<n; i++)
{
memset(visit,0,sizeof(visit));
sum+=dfs(x[i]);
}
return sum;
}
int xxx(char a) //纸牌大小转化
{
int ans;
if(isdigit(a))
ans= a-'0';
else
{
if(a=='T')
ans= 10;
else if(a=='J')
ans=11;
else if(a=='Q')
ans=12;
else if(a=='K')
ans=13;
else if(a=='A')
ans=14;
}
ans*=100; //把大小的权放大,这样就可以直接加上花色的大小,放大倍数不能太小
return ans;
}
int xx(char a)//纸牌花色转化
{
if(a=='H')
return 4;
else if(a=='S')
return 3;
else if(a=='D')
return 2;
else return 1;
}
int main()
{
int t,i,j;
char q,w;
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
cin>>n;
for(i=0; i<n; i++)
{
cin>>q>>w;
y[i]=xxx(q)+xx(w);
}
for(i=0; i<n; i++)
{
cin>>q>>w;
x[i]=xxx(q)+xx(w);
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
if(x[i]>y[j]) // 如果女孩的牌比男孩的大,这就可以看作一种关系
a[x[i]][y[j]]=1;
}
cout<<hungary()<<endl;
}
}
</strong></span>