• hdu 1528 Card Game Cheater ( 二分图匹配 )


    题目:点击打开链接

    题意:两个人纸牌游戏,牌大的人得分。牌大: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;
    }
    
    



  • 相关阅读:
    【CQOI2015】网络吞吐量
    【SDOI2010】所驼门王的宝藏
    【NOIP2013】华容道
    【SNOI2019】通信
    【IOI2016】railroad
    【AtCoder3611】Tree MST
    【AtCoder2134】ZigZag MST
    【CF891C】Envy
    【BZOJ4883】棋盘上的守卫
    【CF888G】Xor-MST
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3295300.html
Copyright © 2020-2023  润新知