原题链接:点击打开链接
题意:已知 Adam’s 和 Eve’s 牌,通过改变EVe's牌的顺序,求EVe's有几张牌>Adam's的牌
思路:想暴力模拟 ,无奈我是个没脑子的人,于是放弃了,转换成图论知识真是碉堡了!!!将给出的每张牌转换成相应的数字存储(简便很多),比较A和E的牌,E的牌比A的牌大时 将这两张牌连边 ;见代码
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int maxx=60;
int ma[maxx][maxx];
int link[maxx],vis[maxx];
map<char,int>m;
void init()//按照合适的大小 将牌面值转换成数字;
{
m['H']=4;
m['S']=3;
m['D']=2;
m['C']=1;
m['1']=0;
m['2']=4;
m['3']=8;
m['4']=12;
m['5']=16;
m['6']=20;
m['7']=24;
m['8']=28;
m['9']=32;
m['T']=36;
m['J']=40;
m['Q']=44;
m['K']=48;
m['A']=52;
}
int dfs(int s)
{
for(int i=1;i<=56;i++)
{
if(ma[s][i] && !vis[i])
{
vis[i]=1;
if(link[i]==-1 || dfs(link[i]))
{
link[i]=s;
return 1;
}
}
}
return 0;
}
int hungary()
{
int i,ans=0;
memset(link,-1,sizeof(link));
for(i=1;i<=56;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
return ans;
}
int main()
{
//freopen("i.txt","r",stdin);
int i,t,j,k,s1[30],s2[30];
char s[3];
init();
scanf("%d",&t);
while(t--){
memset(ma,0,sizeof(ma));
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%s",s);
int t1=m[s[0]];
int t2=m[s[1]];
s1[i]=(t1+t2);//s[1]保存的是A的牌
}
for(i=0;i<k;i++)
{
scanf("%s",s);
int t1=m[s[0]];
int t2=m[s[1]];
s2[i]=(t1+t2);//s[2]保存的是E牌
}
for(i=0;i<k;i++)
for(j=0;j<k;j++)
if(s2[i]>s1[j])//如果E的牌>A的牌,连边;
ma[s2[i]][s1[j]]=1;
printf("%d\n",hungary());//匈牙利算法 求最大匹配;
}
return 0;
}