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;
}
HDU - 1528 Card Game Cheater(二分图最大匹配)相关推荐
- HDU - 5090 Game with Pearls(二分图最大匹配)
题目链接:点击查看 题目大意:杰瑞和汤姆在玩游戏,游戏规则是:汤姆会拿来N个容器,每个容器内一开始就会包含1~N个小球,现在轮到杰瑞操作了,杰瑞可以选择往每个容器里加入0个或者任意k的倍数个小球,问杰 ...
- HDU - 2063 过山车(二分图最大匹配)
题目链接:点击查看 题目大意:中文题目,不多赘述 题目分析:二分图最大匹配问题,匈牙利经典算法模板题,感觉这个博客写的很好,插个眼: https://article.itxueyuan.com/Aea ...
- 解题报告 (九) 二分图最大匹配
文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...
- HDU 3729 I'm Telling the Truth(二分图最大匹配)
HDU 3729 I'm Telling the Truth(二分图最大匹配) http://acm.hdu.edu.cn/showproblem.php?pid=3729 题意: 一位老师想问N位同 ...
- HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...
- HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)
题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...
- HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...
- 二分图判断以及二分图最大匹配
概念 二分图又称作二部图 ,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的 ...
- 二分图最大匹配与最大独立集
一.概念部分 1.什么是二分图? 通俗的说法:就是可以把图分成两部分,每一部分任意两点之间没有关系(同一部落),两部分之间点可能存在多种关系. 2.怎么判断二分图? (1)理论判定:如果某个图为二分图 ...
最新文章
- springboot接收多对象_SpringBoot同时接收单个对象和List<object>参数
- Ansible 详解2-Playbook使用
- 数据监测驱动下的信息流广告优化
- BNU44583——Star Trek: First Contact——————【01背包】
- 玲珑杯round11-B:萌萌哒的第二题
- python之判断一个值是不是可以被调用
- PAT (Basic Level) Practice1011 A+B 和 C
- 计算机12点自动关机,电脑怎么设置定时自动关机命令 电脑设置定时关机方法【图文】...
- MySQL基础(DML,DQL,增删改查)
- python简易中文名转英文小程序
- H5如何获取内网IP和公网IP
- java BPM平台1:设计思路
- HTTP 错误 404.0 - Not Found
- 数据分析(入门)纳米学位_tensorflow纳米级程序对机器学习入门的回顾
- 0906期特别策划——“架构师大阅兵”
- 烧菜技巧 如何炒辣椒油
- SQL语句练习:电商数据库
- unity 中excel转json插件
- Mac 如何关闭「开盖自动开机」功能
- html 顶层标签,HTML什么是顶层标签