欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

HDU - 1528 Card Game Cheater(二分图最大匹配)

发布时间:2024/4/11 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 HDU - 1528 Card Game Cheater(二分图最大匹配) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目链接:点击查看

题目大意:题意有点像求田忌赛马的最优解,大概意思就是现在有两个人,每个人都有n张不同的扑克牌,扑克牌的大小首先以点数来确定,点数相同的情况下以花色来决定,红桃(Heart)>黑桃(Spade)>方块(Diamond)>梅花(Club),然后第一个人的出牌顺序已经确定了,第二个人的出牌顺序可以由我们来决定,问如何让第二个人赢得次数最多

题目分析:简单的二分图最大匹配,两个子集就是第一个人手中的扑克牌和第二个人手中的扑克牌,在预处理的时候对于每张扑克牌的花色和点数用一个结构体来储存,并且重载一下这个结构体的小于号,然后两重循环枚举一下两个人的扑克牌,只要满足第二个人的牌大于第一个人的牌直接建边即可,最后跑一边匈牙利就是答案了

这个题有个小坑,就是A代表的是大王,而不是1,在预处理的时候注意一下即可

代码:

#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=30;int n;struct card {int suit,point;bool operator<(const card& a)const//重载一下小于号{if(point!=a.point)return point<a.point;return suit<a.suit;} }a[N],b[N];int change1(char ch)//预处理点数 {if(isdigit(ch))return ch-'0';else if(ch=='T')return 10;else if(ch=='J')return 11;else if(ch=='Q')return 12;else if(ch=='K')return 13;else if(ch=='A')return 14; }int change2(char ch)//预处理花色 {if(ch=='H')return 4;else if(ch=='S')return 3;else if(ch=='D')return 2;elsereturn 1; }bool maze[N][N],vis[N];int match[N];bool dfs(int x) {for(int i=1;i<=n;i++){if(maze[x][i]&&!vis[i]){vis[i]=true;if(!match[i]||dfs(match[i])){match[i]=x;return true;}}}return false; }void init() {memset(maze,false,sizeof(maze));memset(match,0,sizeof(match)); }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int w;cin>>w;while(w--){init(); scanf("%d",&n);char s[5];for(int i=1;i<=n;i++){scanf("%s",s);a[i].point=change1(s[0]);a[i].suit=change2(s[1]);}for(int i=1;i<=n;i++){scanf("%s",s);b[i].point=change1(s[0]);b[i].suit=change2(s[1]);}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[j]<b[i])maze[i][j]=true;}}int ans=0;for(int i=1;i<=n;i++){memset(vis,false,sizeof(vis));if(dfs(i))ans++;}printf("%d\n",ans);}return 0; }

 

超强干货来袭 云风专访:近40年码龄,通宵达旦的技术人生

总结

以上是生活随笔为你收集整理的HDU - 1528 Card Game Cheater(二分图最大匹配)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。