• hdoj1528【二分匹配】


    题意:
    在一幅扑克牌里,有两个人在比大小,第二个人最多能赢第一个人几张牌。
    思路:
    这道题目用一下二分匹配还是很明显的。
    那么就是建图似乎要麻烦一下,但还是很方便的。将扑克牌一次进行编号,然后牌面比他小的就有一条边。这是一张大的图,两个人的手牌还是要标记一下,因为我们只对取到的牌操作。然后就是在这个范围内跑一跑二分匹配就好了。还是满基础的建图+二分匹配,我都1A了…

    code:

    #include<cstdio>
    #include<math.h>
    #include<vector>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define INF 0X3f3f3f3f
    typedef long long LL;
    
    int ma[55][55];
    bool in1[55];
    bool in2[55];
    bool vis[55];
    int cx[55];
    int cy[55];
    
    int findpath(int u)   //习惯写成findpath...
    {
        for(int i=1;i<=52;i++)
        {
            if(!vis[i]&&in2[i]&&ma[u][i])
            {
                vis[i]=1;
                if(cy[i]==-1)
                {
                    cx[u]=i;
                    cy[i]=u;
                    return 1;
                }
                else if(in1[cy[i]])
                {
                    if(findpath(cy[i]))
                    {
                        cy[i]=u;
                        cx[u]=i;
                        return 1;
                    }
                }
            }
        }
        return 0;
    }
    
    
    void init()
    {
        memset(ma,0,sizeof(ma));
        for(int i=1;i<=52;i++)
        {
            for(int j=1;j<i;j++)
                ma[i][j]=1;
        }
    }
    
    int get1(char x)
    {
        if(x>='2'&&x<='9')
            return x-1-48;
        if(x=='T')
            return 9;
        if(x=='J')
            return 10;
        if(x=='Q')
            return 11;
        if(x=='K')
            return 12;
        if(x=='A')
            return 13;
    }
    int get2(char x)
    {
        if(x=='C')
            return 1;
        if(x=='D')
            return 2;
        if(x=='S')
            return 3;
        if(x=='H')
            return 4;
    }
    
    int main()
    {
        init();
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            scanf("%d",&n);
            char xx[3];
            memset(in1,0,sizeof(in1));
            memset(in2,0,sizeof(in2));
    
            for(int i=0;i<n;i++)
            {
                scanf("%s",xx);
                int s1=get1(xx[0]);
                s1=(s1-1)*4;
                int s2=get2(xx[1]);
                in2[s1+s2]=1;
            }
            for(int i=0;i<n;i++)
            {
                scanf("%s",xx);
                int s1=get1(xx[0]);
                s1=(s1-1)*4;
                int s2=get2(xx[1]);
                in1[s1+s2]=1;
            }
    
    //        for(int i=1;i<=52;i++)
    //        {
    //            if(in2[i])
    //                printf("%d ",i);
    //        }
    //        puts("");
    //
    //        for(int i=1;i<=52;i++)
    //        {
    //            if(in1[i])
    //                printf("%d ",i);
    //        }
    //        puts("");
    
            memset(cx,-1,sizeof(cx));
            memset(cy,-1,sizeof(cy));
    
            int ans=0;
            for(int i=1;i<=52;i++)
            {
                if(cx[i]==-1&&in1[i])
                {
                    memset(vis,0,sizeof(vis));
                    if(findpath(i))
                    {
                        //printf("%d
    ",i);
                        ans++;
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
    
    /*
    
    100
    1
    JD
    JH
    2
    5D TC
    4C 5H
    3
    2H 3H 4H
    2D 3D 4D
    
    
    */
    
    
  • 相关阅读:
    隔离级别
    cookie
    session
    正则表达式
    hello2源代码解析
    servlet_filter简介
    web.xml
    Annotations
    Java design patterna
    CDI Features
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934505.html
Copyright © 2020-2023  润新知