• Atcoder JAG Practice Contest for ACM-ICPC Asia Regional 2012 B


    点击这里进入题目

    作者的话:同学们,我这个方法真的是算烦的,标称只有我的四分之一,但是假如你要深入理解题目我推荐我的程序,假如只是为了图个“方便”,还是别看了。

    题目大意:根据德克萨斯扑克的规则,有五张牌应该是明牌,但是此时只明了三张,告诉你你的两张手牌,三张明牌,和对手的三张明牌,求你获胜的概率。

    思路:模拟。模拟所有情况,一一对比,典型的思路简单,程序爆难,我大概调了两天。。。
    我们拆开来看。


    1.首先要用一个类型来存储牌,可以用pair,但是程序这么长很容易就忘记哪个是color,哪个是number,所以还是定义一个类型,放两个int进去,一个名为col,一个名为num。同时写好cmp函数,为下文快排做准备。

    struct node
    {
        int col,num;
    }my[5],emy[5],com[10];
    bool cmp(const node &a,const node &b)
    {
        return a.num<b.num;
    }
    bool cmp2(const node &a,const node &b)
    {
        return a.num>b.num;
    }

    2.读入,存储输进去的牌。因为我们要比较大小,所以我们将T,J,Q,K,A标为10,11,12,13,14。为了方便存储,把C,D,H,S标位1,2,3,4。分别存在my,emy(enemy),com(community)三个数组中。

    //判断是否为数字
    bool is_dig(char c)
    {
        return (c>='0' && c<='9');
    }
    //将char的花色转为数字
    int solcol(char c)
    {
        if(c=='S')
        return 1;
        if(c=='H')
        return 2;
        if(c=='D')
        return 3;
        return 4;
    }
    //将char的牌转为int
    int solnum(char c)
    {
        if(is_dig(c))
        return int(c-'0');
        if(c=='T')
        return 10;
        if(c=='J')
        return 11;
        if(c=='Q')
        return 12;
        if(c=='K')
        return 13;
        return 14;
    }
    //记录我的牌
    void tomy(int k,int col,int num)
    {
        my[k].col=col;
        my[k].num=num;
    }
    //记录对手的牌
    void toemy(int k,int col,int num)
    {
        emy[k].col=col;
        emy[k].num=num;
    }
    //记录展开的牌
    void tocom(int k,int col,int num)
    {
        com[k].col=col;
        com[k].num=num;
    }
    //处理所有输入的数据
    void tosub(string s,int flag,int k)
    {
        int col=solcol(s[0]),num=solnum(s[1]);
        if(flag==1)
        tomy(k,col,num);
        else
        {
            if(flag==2)
            toemy(k,col,num);
            else
            tocom(k,col,num);
        }
        used[col][num]=1;
    }

    3.这样输入的处理就完成了,要开始处理数据,首先就是要暴力没有展开的几张牌。用四层循环搞定,保证牌不一样再check,我把这一段写在main函数里。

    //解决问题
            int tot=0,ans=0;
            for(int i=1;i<=4;i++)
            {
                for(int j=2;j<=14;j++)
                {
                    if(!used[i][j])
                    {
                        for(int k=1;k<=4;k++)
                        {
                            for(int t=2;t<=14;t++)
                            {
                                if(!used[k][t])
                                {
                                    if(i!=k || j!=t)
                                    {
                                        tot++;
                                        if(check(i,j,k,t))
                                        {
                                            ans++;
                                            //aaa[check(i,j,k,t)]++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

    4.check函数相当于一个交通枢纽,所有的组合方式按照大小排序塞在这里面。每当处在同一种排序方式,并且我的比对方大时,便会return,ans+1。

    int check(int col1,int num1,int col2,int num2)
    {
        //cout<<check10(col1,num1,col2,num2,1)<<" "<<check10(col1,num1,col2,num2,0)<<endl;
          if(check10(col1,num1,col2,num2,1)>check10(col1,num1,col2,num2,0))
          return 10;
          if(check10(col1,num1,col2,num2,1)<check10(col1,num1,col2,num2,0))
          return 0;
          if(check10(col1,num1,col2,num2,1)>0)
          return 0;
          if(check9(col1,num1,col2,num2,1)>check9(col1,num1,col2,num2,0))
          return 9;
          if(check9(col1,num1,col2,num2,1)<check9(col1,num1,col2,num2,0))
          return 0;
          if(check9(col1,num1,col2,num2,1)>0)
          return 0;
          if(check8(col1,num1,col2,num2,1)>check8(col1,num1,col2,num2,0))
          return 8;
          if(check8(col1,num1,col2,num2,1)<check8(col1,num1,col2,num2,0))
          return 0;
          if(check8(col1,num1,col2,num2,1)>0)
          return 0;
          if(check7(col1,num1,col2,num2,1)>check7(col1,num1,col2,num2,0))
          return 7;
          if(check7(col1,num1,col2,num2,1)<check7(col1,num1,col2,num2,0))
          return 0;
          if(check7(col1,num1,col2,num2,1)>0)
          return 0;
          if(check6(col1,num1,col2,num2,1)>check6(col1,num1,col2,num2,0))
          return 6;
          if(check6(col1,num1,col2,num2,1)<check6(col1,num1,col2,num2,0))
          return 0;
          if(check6(col1,num1,col2,num2,1)>0)
          return 0;
          if(check5(col1,num1,col2,num2,1)>check5(col1,num1,col2,num2,0))
          return 5;
          if(check5(col1,num1,col2,num2,1)<check5(col1,num1,col2,num2,0))
          return 0;
          if(check5(col1,num1,col2,num2,1)>0)
          return 0;
          if(check4(col1,num1,col2,num2,1)>check4(col1,num1,col2,num2,0))
          return 4;
          if(check4(col1,num1,col2,num2,1)<check4(col1,num1,col2,num2,0))
          return 0;
          if(check4(col1,num1,col2,num2,1)>0)
          return 0;
          if(check3(col1,num1,col2,num2,1)>check3(col1,num1,col2,num2,0))
          return 3;
          if(check3(col1,num1,col2,num2,1)<check3(col1,num1,col2,num2,0))
          return 0;
          if(check3(col1,num1,col2,num2,1)>0)
          return 0;
          if(check2(col1,num1,col2,num2,1)>check2(col1,num1,col2,num2,0))
          return 2;
          if(check2(col1,num1,col2,num2,1)<check2(col1,num1,col2,num2,0))
          return 0;
          if(check2(col1,num1,col2,num2,1)>0)
          return 0;
          if(check1(col1,num1,col2,num2,1)>check1(col1,num1,col2,num2,0))
          return 1;
          if(check1(col1,num1,col2,num2,1)<check1(col1,num1,col2,num2,0))
          return 0;
          return 0;
    }

    5.这一段是最难调的,就是各种牌型的处理方式,一看就能明白。我是用一个ans来表示所有牌型的大小,通过排序,再ans*100+x这种方式,可以将牌从多张,变成一个数,方便比较。都是相同的思想,只要按照规则来就行,就不一一解释了。(每个函数前要写上对应的牌型,放置后面调试时忘记)

    //皇家
    int check10(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            if(my[i].num>=10)
            a[my[i].col]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            if(emy[i].num>=10)
            a[emy[i].col]++;
        }
        for(int i=1;i<=3;i++)
        if(com[i].num>=10)
        a[com[i].col]++;
        if(num1>=10)
        a[col1]++;
        if(num2>=10)
        a[col2]++;
        for(int i=1;i<=4;i++)
        {
            if(a[i]==5)
            return 1;
        }
        return 0;
    }
    //同花顺
    int check9(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[100],maxn=0;
        for(int k=1;k<=4;k++)
        {
            memset(a,0,sizeof(a));
                for(int i=1;i<=2;i++)
                {
                    if(flag)
                    {
                        if(my[i].col==k)
                        {
                           a[my[i].num]++;
                            if(my[i].num==14)
                            a[1]++;
                        }
                    }
                    else
                    {
                        if(emy[i].col==k)
                        {
                           a[emy[i].num]++;
                            if(emy[i].num==14)
                            a[1]++;
                        }
                    }
                }
                for(int i=1;i<=3;i++)
                {
                    if(com[i].col==k)
                    {
                        a[com[i].num]++;
                        if(com[i].num==14)
                        a[1]++;
                    }
                }
                if(col1==k)
                {
                    a[num1]++;
                    if(num1==14)
                    a[1]++;
                }
                if(col2==k)
                {
                    a[num2]++;
                    if(num2==14)
                    a[1]++;
                }
                for(int i=14;i>=5;i--)
                {
                    if(a[i] && a[i-1] && a[i-2] && a[i-3] && a[i-4])
                    {
                        maxn=max(maxn,i);
                        break;
                    }
                }
        }
        if(maxn)
        return maxn;
        return 0;
    }
    //四张
    int check8(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        int ans=0;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=4)
            {
                ans=i;
                a[i]-=4;
                break;
            }
        }
        if(!ans)
        return 0;
        for(int i=14;i>=2;i--)
        {
            if(a[i])
            {
                ans=ans*100+i;
                break;
            }
        }
        if(ans>100)
        return ans;
        return 0;
    }
    //三张
    int check7(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        int s1=0,s2=0,pl=0;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=3)
            {
                s1=i;
                a[i]-=3;
                break;
            }
        }
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=2)
            {
                if(flag)
                {
                    s2=i;
                    break;
                }
                else
                {
                    if(i!=pl)
                    {
                        s2=i;
                        break;
                    }
                }
            }
        }
        if(s1 && s2)
        return s1*100+s2;
        return 0;
    }
    //同花
    ll check6(int col1,int num1,int col2,int num2,bool flag)
    {
        ll ans[50];
        int ok[50];
        node a[100];
    
        memset(ok,0,sizeof(ok));
        memset(ans,0,sizeof(ans));
        int tot=0,sum=1;
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[++tot]=my[i];
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[++tot]=emy[i];
        }
        for(int i=1;i<=3;i++)
        a[++tot]=com[i];
        a[++tot].num=num1;
        a[tot].col=col1;
        a[++tot].num=num2;
        a[tot].col=col2;
        sort(a+1,a+tot+1,cmp2);
        for(int i=1;i<=tot;i++)
        {
            if(ok[a[i].col]<5)
            {
                ans[a[i].col]=ans[a[i].col]*100+1ll*a[i].num;
                ok[a[i].col]++;
            }
        }
        for(int i=1;i<=4;i++)
        if(ok[i]==5 && ans[i]>1e8)
        return ans[i];
        return 0;
    }
    //顺子
    int check5(int col1,int num1,int col2,int num2,bool flag)
    {
        int num[50];
        node a[100];
        for(int i=0;i<50;i++)
        num[i]=1;
        int tot=0,sum=1;
        for(int i=1;i<=2;i++)
        {
            if(flag)
            {
                a[++tot]=my[i];
                if(my[i].num==14)
                {
                    a[++tot].col=my[i].col;
                    a[tot].num=1;
                }
            }
            else
            {
                a[++tot]=emy[i];
                if(emy[i].num==14)
                {
                    a[++tot].col=emy[i].col;
                    a[tot].num=1;
                }
            }
        }
        for(int i=1;i<=3;i++)
        {
          a[++tot]=com[i];
          if(com[i].num==14)
          {
              a[++tot].col=com[i].col;
              a[tot].num=1;
          }
        }
        a[++tot].num=num1;
        a[tot].col=col1;
        a[++tot].num=num2;
        a[tot].col=col2;
        if(num1==14)
        {
            a[++tot].col=col1;
            a[tot].num=1;
        }
        if(num2==14)
        {
            a[++tot].col=col2;
            a[tot].num=1;
        }
        sort(a+1,a+tot+1,cmp);
        for(int i=1;i<tot;i++)
        {
            for(int j=i+1;j<=tot;j++)
              if(a[j].num==a[i].num+1)
              num[a[j].num]=max(num[a[j].num],num[a[i].num]+1);
        }
        for(int i=14;i>=2;i--)
        if(num[i]>=5)
        return i;
        return 0;
    }
    //三张
    int check4(int col1,int num1,int col2,int num2,bool flag)
    {
        int ans=0,num=2;
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=3)
            {
                ans=i;
                a[i]-=3;
                break;
            }
        }
        if(!ans)
        return 0;
        for(int i=14;i>=2;i--)
        {
            if(a[i] && num)
            {
                num--;
                ans=ans*100+i;
            }
        }
        if(ans>1e4)
        return ans;
        return 0;
    }
    //两对
    int check3(int col1,int num1,int col2,int num2,bool flag)
    {
        int ans=0,p1=0,p2=0;
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=2)
            {
                if(!p1)
                {
                    if(flag)
                    {
                        ans=i;
                        p1=i;
                        a[i]-=2;
                    }
                    else
                    {
                        p1=i;
                        a[i]-=2;
                    }
                }
                else
                    if(!p2)
                    {
                        if(flag)
                        {
                            ans=ans*100+i;
                            p2=i;
                            a[i]-=2;
                        }
                        else
                        {
                            p2=i;
                            a[i]-=2;
                        }
                    }
            }
        }
        if(!p1 || !p2)
        return 0;
        if(!flag)
        ans=p1*100+p2;
        for(int i=14;i>=2;i--)
        {
            if(a[i])
            {
                ans=ans*100+i;
                break;
            }
        }
        if(ans>1e4)
        return ans;
        return 0;
    }
    //一对
    int check2(int col1,int num1,int col2,int num2,bool flag)
    {
        int ans=0,sum=0,a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=2)
            {
                ans=i;
                a[i]-=2;
                break;
            }
        }
        if(!ans)
        return 0;
        for(int i=14;i>=2;i--)
        {
            if(a[i] && sum<3)
            {
                ans=ans*100+i;
                sum++;
            }
        }
        if(ans>1e6)
        return ans;
        return 0;
    }
    //高牌
    ll check1(int col1,int num1,int col2,int num2,bool flag)
    {
        ll ans=0;
        int sum=5,a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(sum && a[i])
            {
                ans=ans*100+i;
                sum--;
            }
        }
        if(ans>1e8)
        return ans;
        return 0;
    }

    基本没人会看到这,下面是AC程序,大概有700行。(前方高能)

    //库省略
    using namespace std;
    int n,m;
    bool used[5][205];
    struct node
    {
        int col,num;
    }my[5],emy[5],com[10];
    bool cmp(const node &a,const node &b)
    {
        return a.num<b.num;
    }
    bool cmp2(const node &a,const node &b)
    {
        return a.num>b.num;
    }
    //判断是否为数字
    bool is_dig(char c)
    {
        return (c>='0' && c<='9');
    }
    //将char的花色转为数字
    int solcol(char c)
    {
        if(c=='S')
        return 1;
        if(c=='H')
        return 2;
        if(c=='D')
        return 3;
        return 4;
    }
    //将char的牌转为int
    int solnum(char c)
    {
        if(is_dig(c))
        return int(c-'0');
        if(c=='T')
        return 10;
        if(c=='J')
        return 11;
        if(c=='Q')
        return 12;
        if(c=='K')
        return 13;
        return 14;
    }
    //记录我的牌
    void tomy(int k,int col,int num)
    {
        my[k].col=col;
        my[k].num=num;
    }
    //记录对手的牌
    void toemy(int k,int col,int num)
    {
        emy[k].col=col;
        emy[k].num=num;
    }
    //记录展开的牌
    void tocom(int k,int col,int num)
    {
        com[k].col=col;
        com[k].num=num;
    }
    //处理所有输入的数据
    void tosub(string s,int flag,int k)
    {
        int col=solcol(s[0]),num=solnum(s[1]);
        if(flag==1)
        tomy(k,col,num);
        else
        {
            if(flag==2)
            toemy(k,col,num);
            else
            tocom(k,col,num);
        }
        used[col][num]=1;
    }
    //皇家
    int check10(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            if(my[i].num>=10)
            a[my[i].col]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            if(emy[i].num>=10)
            a[emy[i].col]++;
        }
        for(int i=1;i<=3;i++)
        if(com[i].num>=10)
        a[com[i].col]++;
        if(num1>=10)
        a[col1]++;
        if(num2>=10)
        a[col2]++;
        for(int i=1;i<=4;i++)
        {
            if(a[i]==5)
            return 1;
        }
        return 0;
    }
    //同花顺
    int check9(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[100],maxn=0;
        for(int k=1;k<=4;k++)
        {
            memset(a,0,sizeof(a));
                for(int i=1;i<=2;i++)
                {
                    if(flag)
                    {
                        if(my[i].col==k)
                        {
                           a[my[i].num]++;
                            if(my[i].num==14)
                            a[1]++;
                        }
                    }
                    else
                    {
                        if(emy[i].col==k)
                        {
                           a[emy[i].num]++;
                            if(emy[i].num==14)
                            a[1]++;
                        }
                    }
                }
                for(int i=1;i<=3;i++)
                {
                    if(com[i].col==k)
                    {
                        a[com[i].num]++;
                        if(com[i].num==14)
                        a[1]++;
                    }
                }
                if(col1==k)
                {
                    a[num1]++;
                    if(num1==14)
                    a[1]++;
                }
                if(col2==k)
                {
                    a[num2]++;
                    if(num2==14)
                    a[1]++;
                }
                for(int i=14;i>=5;i--)
                {
                    if(a[i] && a[i-1] && a[i-2] && a[i-3] && a[i-4])
                    {
                        maxn=max(maxn,i);
                        break;
                    }
                }
        }
        if(maxn)
        return maxn;
        return 0;
    }
    //四张
    int check8(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        int ans=0;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=4)
            {
                ans=i;
                a[i]-=4;
                break;
            }
        }
        if(!ans)
        return 0;
        for(int i=14;i>=2;i--)
        {
            if(a[i])
            {
                ans=ans*100+i;
                break;
            }
        }
        if(ans>100)
        return ans;
        return 0;
    }
    //三张
    int check7(int col1,int num1,int col2,int num2,bool flag)
    {
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        int s1=0,s2=0,pl=0;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=3)
            {
                s1=i;
                a[i]-=3;
                break;
            }
        }
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=2)
            {
                if(flag)
                {
                    s2=i;
                    break;
                }
                else
                {
                    if(i!=pl)
                    {
                        s2=i;
                        break;
                    }
                }
            }
        }
        if(s1 && s2)
        return s1*100+s2;
        return 0;
    }
    //同花
    ll check6(int col1,int num1,int col2,int num2,bool flag)
    {
        ll ans[50];
        int ok[50];
        node a[100];
    
        memset(ok,0,sizeof(ok));
        memset(ans,0,sizeof(ans));
        int tot=0,sum=1;
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[++tot]=my[i];
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[++tot]=emy[i];
        }
        for(int i=1;i<=3;i++)
        a[++tot]=com[i];
        a[++tot].num=num1;
        a[tot].col=col1;
        a[++tot].num=num2;
        a[tot].col=col2;
        sort(a+1,a+tot+1,cmp2);
        for(int i=1;i<=tot;i++)
        {
            if(ok[a[i].col]<5)
            {
                ans[a[i].col]=ans[a[i].col]*100+1ll*a[i].num;
                ok[a[i].col]++;
            }
        }
        for(int i=1;i<=4;i++)
        if(ok[i]==5 && ans[i]>1e8)
        return ans[i];
        return 0;
    }
    //顺子
    int check5(int col1,int num1,int col2,int num2,bool flag)
    {
        int num[50];
        node a[100];
        for(int i=0;i<50;i++)
        num[i]=1;
        int tot=0,sum=1;
        for(int i=1;i<=2;i++)
        {
            if(flag)
            {
                a[++tot]=my[i];
                if(my[i].num==14)
                {
                    a[++tot].col=my[i].col;
                    a[tot].num=1;
                }
            }
            else
            {
                a[++tot]=emy[i];
                if(emy[i].num==14)
                {
                    a[++tot].col=emy[i].col;
                    a[tot].num=1;
                }
            }
        }
        for(int i=1;i<=3;i++)
        {
          a[++tot]=com[i];
          if(com[i].num==14)
          {
              a[++tot].col=com[i].col;
              a[tot].num=1;
          }
        }
        a[++tot].num=num1;
        a[tot].col=col1;
        a[++tot].num=num2;
        a[tot].col=col2;
        if(num1==14)
        {
            a[++tot].col=col1;
            a[tot].num=1;
        }
        if(num2==14)
        {
            a[++tot].col=col2;
            a[tot].num=1;
        }
        sort(a+1,a+tot+1,cmp);
        for(int i=1;i<tot;i++)
        {
            for(int j=i+1;j<=tot;j++)
              if(a[j].num==a[i].num+1)
              num[a[j].num]=max(num[a[j].num],num[a[i].num]+1);
        }
        for(int i=14;i>=2;i--)
        if(num[i]>=5)
        return i;
        return 0;
    }
    //三张
    int check4(int col1,int num1,int col2,int num2,bool flag)
    {
        int ans=0,num=2;
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=3)
            {
                ans=i;
                a[i]-=3;
                break;
            }
        }
        if(!ans)
        return 0;
        for(int i=14;i>=2;i--)
        {
            if(a[i] && num)
            {
                num--;
                ans=ans*100+i;
            }
        }
        if(ans>1e4)
        return ans;
        return 0;
    }
    //两对
    int check3(int col1,int num1,int col2,int num2,bool flag)
    {
        int ans=0,p1=0,p2=0;
        int a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=2)
            {
                if(!p1)
                {
                    if(flag)
                    {
                        ans=i;
                        p1=i;
                        a[i]-=2;
                    }
                    else
                    {
                        p1=i;
                        a[i]-=2;
                    }
                }
                else
                    if(!p2)
                    {
                        if(flag)
                        {
                            ans=ans*100+i;
                            p2=i;
                            a[i]-=2;
                        }
                        else
                        {
                            p2=i;
                            a[i]-=2;
                        }
                    }
            }
        }
        if(!p1 || !p2)
        return 0;
        if(!flag)
        ans=p1*100+p2;
        for(int i=14;i>=2;i--)
        {
            if(a[i])
            {
                ans=ans*100+i;
                break;
            }
        }
        if(ans>1e4)
        return ans;
        return 0;
    }
    //一对
    int check2(int col1,int num1,int col2,int num2,bool flag)
    {
        int ans=0,sum=0,a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(a[i]>=2)
            {
                ans=i;
                a[i]-=2;
                break;
            }
        }
        if(!ans)
        return 0;
        for(int i=14;i>=2;i--)
        {
            if(a[i] && sum<3)
            {
                ans=ans*100+i;
                sum++;
            }
        }
        if(ans>1e6)
        return ans;
        return 0;
    }
    //高牌
    ll check1(int col1,int num1,int col2,int num2,bool flag)
    {
        ll ans=0;
        int sum=5,a[50];
        memset(a,0,sizeof(a));
        if(flag)
        {
            for(int i=1;i<=2;i++)
            a[my[i].num]++;
        }
        else
        {
            for(int i=1;i<=2;i++)
            a[emy[i].num]++;
        }
        for(int i=1;i<=3;i++)
        a[com[i].num]++;
        a[num1]++;
        a[num2]++;
        for(int i=14;i>=2;i--)
        {
            if(sum && a[i])
            {
                ans=ans*100+i;
                sum--;
            }
        }
        if(ans>1e8)
        return ans;
        return 0;
    }
    int check(int col1,int num1,int col2,int num2)
    {
        //cout<<check10(col1,num1,col2,num2,1)<<" "<<check10(col1,num1,col2,num2,0)<<endl;
          if(check10(col1,num1,col2,num2,1)>check10(col1,num1,col2,num2,0))
          return 10;
          if(check10(col1,num1,col2,num2,1)<check10(col1,num1,col2,num2,0))
          return 0;
          if(check10(col1,num1,col2,num2,1)>0)
          return 0;
          if(check9(col1,num1,col2,num2,1)>check9(col1,num1,col2,num2,0))
          return 9;
          if(check9(col1,num1,col2,num2,1)<check9(col1,num1,col2,num2,0))
          return 0;
          if(check9(col1,num1,col2,num2,1)>0)
          return 0;
          if(check8(col1,num1,col2,num2,1)>check8(col1,num1,col2,num2,0))
          return 8;
          if(check8(col1,num1,col2,num2,1)<check8(col1,num1,col2,num2,0))
          return 0;
          if(check8(col1,num1,col2,num2,1)>0)
          return 0;
          if(check7(col1,num1,col2,num2,1)>check7(col1,num1,col2,num2,0))
          return 7;
          if(check7(col1,num1,col2,num2,1)<check7(col1,num1,col2,num2,0))
          return 0;
          if(check7(col1,num1,col2,num2,1)>0)
          return 0;
          if(check6(col1,num1,col2,num2,1)>check6(col1,num1,col2,num2,0))
          return 6;
          if(check6(col1,num1,col2,num2,1)<check6(col1,num1,col2,num2,0))
          return 0;
          if(check6(col1,num1,col2,num2,1)>0)
          return 0;
          if(check5(col1,num1,col2,num2,1)>check5(col1,num1,col2,num2,0))
          return 5;
          if(check5(col1,num1,col2,num2,1)<check5(col1,num1,col2,num2,0))
          return 0;
          if(check5(col1,num1,col2,num2,1)>0)
          return 0;
          if(check4(col1,num1,col2,num2,1)>check4(col1,num1,col2,num2,0))
          return 4;
          if(check4(col1,num1,col2,num2,1)<check4(col1,num1,col2,num2,0))
          return 0;
          if(check4(col1,num1,col2,num2,1)>0)
          return 0;
          if(check3(col1,num1,col2,num2,1)>check3(col1,num1,col2,num2,0))
          return 3;
          if(check3(col1,num1,col2,num2,1)<check3(col1,num1,col2,num2,0))
          return 0;
          if(check3(col1,num1,col2,num2,1)>0)
          return 0;
          if(check2(col1,num1,col2,num2,1)>check2(col1,num1,col2,num2,0))
          return 2;
          if(check2(col1,num1,col2,num2,1)<check2(col1,num1,col2,num2,0))
          return 0;
          if(check2(col1,num1,col2,num2,1)>0)
          return 0;
          if(check1(col1,num1,col2,num2,1)>check1(col1,num1,col2,num2,0))
          return 1;
          if(check1(col1,num1,col2,num2,1)<check1(col1,num1,col2,num2,0))
          return 0;
          return 0;
    }
    int main()
    {
        int k,aaa[15];
        memset(aaa,0,sizeof(aaa));
        string s;
        cin>>s;
        while(s!="#")
        {
            memset(used,0,sizeof(used));
            tosub(s,1,1);
            cin>>s;
            tosub(s,1,2);
            for(int i=1;i<=2;i++)
            {
                cin>>s;
                tosub(s,2,i);
            }
            for(int i=1;i<=3;i++)
            {
                cin>>s;
                tosub(s,3,i);
            }
            //解决问题
            int tot=0,ans=0;
            for(int i=1;i<=4;i++)
            {
                for(int j=2;j<=14;j++)
                {
                    if(!used[i][j])
                    {
                        for(int k=1;k<=4;k++)
                        {
                            for(int t=2;t<=14;t++)
                            {
                                if(!used[k][t])
                                {
                                    if(i!=k || j!=t)
                                    {
                                        tot++;
                                        if(check(i,j,k,t))
                                        {
                                            ans++;
                                            aaa[check(i,j,k,t)]++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            //cout<<ans<<' '<<tot<<endl;
            //for(int i=1;i<=10;i++)
            //cout<<aaa[i]<<" ";
            //cout<<endl;
            printf("%0.8lf
    ",double(ans)/tot);
            cin>>s;
        }
        return 0;
    }
    
  • 相关阅读:
    HDU 1505 & POJ 1964 City Game (递推+扫描法)
    web页面内容优化管理与性能技巧
    POJ2406简单KMP
    poj2418map或者字典树
    poj2418map或者字典树
    POJ2296二分2sat
    POJ2296二分2sat
    poj2186强联通(牛仰慕)
    poj2186强联通(牛仰慕)
    poj2175费用流消圈算法
  • 原文地址:https://www.cnblogs.com/NightRaven/p/9333242.html
Copyright © 2020-2023  润新知