HDU - 1528 Card Game Cheater(二分图最大匹配)
生活随笔
收集整理的這篇文章主要介紹了
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(二分图最大匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 468B Tw
- 下一篇: CodeForces - 1203F1