题意:两个人分别有n张牌 并给出牌的大小关系,用田忌赛马的方式
求第二个人最多能赢多少张牌;
思路:给每张牌一个值 用二分匹配搞
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <math.h>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#define cler(arr, val) memset(arr, val, sizeof(arr))
#define IN freopen ("in.txt" , "r" , stdin);
#define OUT freopen ("out.txt" , "w" , stdout);
typedef long long LL;
const int MAXN = 130;//点数的最大值
const int MAXM = 20006;//边数的最大值
const int INF = 1101521204;
const int mod = 10000007;
int getval(char *s)
{
int res;
if('2'<=s[0]&&s[0]<='9')
res=(s[0]-'2')*4;
else
{
if(s[0]=='T') res=8*4;
if(s[0]=='J') res=9*4;
if(s[0]=='Q') res=10*4;
if(s[0]=='K') res=11*4;
if(s[0]=='A') res=12*4;
}
if(s[1]=='H') res+=3;
if(s[1]=='S') res+=2;
if(s[1]=='D') res+=1;
return res;
}
int a[44],b[44],numN;
int link[44],used[44];
bool dfs(int u)
{
for(int i=0;i<numN;i++)
{
if(!used[i]&&b[u]>a[i])
{
used[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=u;
return true;
}
}
}
return false;
}
int findmax()
{
int res=0;
cler(link,-1);
for(int i=0;i<numN;i++)
{
cler(used,0);
if(dfs(i))
res++;
}
return res;
}
int main()
{
int t,n;
// IN;
scanf("%d",&t);
while(t--)
{
char s[4];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
a[i]=getval(s);
}
for(int i=0;i<n;i++)
{
scanf("%s",s);
b[i]=getval(s);
}
numN=n;
// for(int i=0;i<n;i++)
// printf("%d %d\n",a[i],b[i]);
printf("%d\n",findmax());
}
return 0;
}