题目:点击打开链接
题意:两个人纸牌游戏,牌大的人得分。牌大:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q
< K < A 。值一样看花色, hearts (红心) > spades (黑桃) > diamond (方块) >
clubs (梅花)。问Eve 能得多少分。(每次得1分)
分析:将Eve的每张牌与Adam的所有牌比较,与所有比这张牌小的Adam的牌连边。
然后求最大匹配。
感想:几天前就写了,开始WA以为是对于王没有四种花色的处理应该分开。昨天
突然发现问题根本不在那,因为这里面根本没说王,是数组开小了。
代码:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; char t1[15]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; int t2[15]={1,2,3,4,5,6,7,8,9,10,11,12,13}; struct node { int id; char cha; char type; }card[60]; int n,cnt; int match[60]; int vis[60]; int g[60][60]; bool judge(int x,int y) { if(card[x].type=='H' && card[y].type!='H') return true; else if(card[x].type=='S' && (card[y].type=='D'||card[y].type=='C')) return true; else if(card[x].type=='D' && card[y].type=='C') return true; else return false; } bool dfs(int u) { for(int i=1;i<=n;i++) { if(g[u][i] && !vis[i]) { vis[i]=true; if(match[i]==-1 || dfs(match[i])) { match[i]=u; return true; } } } return false; } int main() { int T,i,j,k; scanf("%d",&T); while(T--) { scanf("%d",&n); getchar(); memset(card,0,sizeof(card)); memset(match,-1,sizeof(match)); memset(g,0,sizeof(g)); for(j=1;j<=n;j++) { card[j].cha=getchar(); for(k=0;k<13;k++) if(card[j].cha==t1[k]) card[j].id=t2[k]; /*if(card[j].id==13) { if(j<=n-1) getchar(); continue; }*/ card[j].type=getchar(); if(j<=n-1) getchar(); } getchar(); for(j=n+1;j<=2*n;j++) { card[j].cha=getchar(); for(k=0;k<13;k++) if(card[j].cha==t1[k]) card[j].id=t2[k]; /*if(card[j].id==13) { if(j<=n-1) getchar(); continue; }*/ card[j].type=getchar(); getchar(); for(i=1;i<=n;i++) { if(card[j].id>card[i].id) g[j][i]=true; else if(card[j].id==card[i].id && judge(j,i)) g[j][i]=true; } } cnt=0; for(i=n+1;i<=2*n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) cnt++; } printf("%d ",cnt); } return 0; }