zoukankan      html  css  js  c++  java
  • Card Game Cheater---hdu1528(扑克建图求二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1528

    题意就是给有两个人有n张牌第二个人知道第一个人的牌的序列;

    然后第二个人尽可能的让自己得更高的分,求这个最高分;

    就是对方拿一张牌出来自己拿一张比他大的就得1分,如果相等就按红桃>黑桃>方块>梅花进行比较;

    建图求最大匹配就可以了;注意:A是最大的牌。。。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    #define N 220
    
    int n, maps[N][N], vis[N], used[N];
    
    struct node
    {
        int v,s;///v是纸牌的价值,s类型1:梅花  2:方块  3:黑桃  4:红桃;
    } a[N], b[N];
    
    void change(char s[], node &a)///传入地址才能改变它的值;
    {
        if(s[0]<='9'&&s[0]>='2')a.v=s[0]-'0';
        if(s[0]=='A')a.v=14;///A是最大的牌;;;;;
        if(s[0]=='T')a.v=10;
        if(s[0]=='J')a.v=11;
        if(s[0]=='Q')a.v=12;
        if(s[0]=='K')a.v=13;
    
        if(s[1]=='H')a.s=4;
        if(s[1]=='S')a.s=3;
        if(s[1]=='D')a.s=2;
        if(s[1]=='C')a.s=1;
    }
    bool Find(int u)
    {
        for(int i=1; i<=n; i++)
        {
            if(!vis[i] && maps[u][i])
            {
                vis[i]=1;
                if(!used[i] || Find(used[i]))
                {
                    used[i]=u;
                    return true;
                }
            }
        }
        return false;
    }
    int main()
    {
        int T;
        char s[11];
        scanf("%d", &T);
        while(T--)
        {
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(maps, 0, sizeof(maps));
            memset(used, 0, sizeof(used));
            scanf("%d", &n);
            for(int i=1; i<=n; i++)
            {
                scanf("%s", s);
                change(s, a[i]);
            }
            for(int i=1; i<=n; i++)
            {
                scanf("%s", s);
                change(s, b[i]);
                for(int j=1; j<=n; j++)///建立b和a的关系,当为1时说明第二个人的那张牌大一第一个人的那张牌;
                {
                    if(b[i].v>a[j].v)
                        maps[i][j] = 1;
                    if(b[i].v==a[j].v && b[i].s>a[j].s)
                        maps[i][j] = 1;
                }
            }
            int ans=0;
            for(int i=1; i<=n; i++)
            {
                memset(vis, 0, sizeof(vis));
                if(Find(i))
                    ans++;
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    PoolMember 用法
    pool 提供的方法
    F5 VirtualServer 提供的方法
    入职两年,我和业务撕了108次逼
    C 语言编程 — 函数
    C 语言编程 — 逻辑控制语句
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4948440.html
Copyright © 2011-2022 走看看