• 玩骰子(hdu校赛)


    题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=638

    账号:team2166  密码:148090

    玩骰子

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 678    Accepted Submission(s): 179


    Problem Description
      Nias与Ains都特别喜欢玩骰子,而且都自以为比对方玩得更溜。
      终于有一天,他们决定用骰子来一决高下!
      一般的骰子玩法已经不足以体现他们的水平了,于是他们自创了一套玩法来PK:
    首先,每人掷3个骰子;之后,可以选择其中一个骰子重新掷(当然也可以放弃这一步),最后,比较投掷结果的大小,结果大的那方获胜,一样的话为平局。
      大小比较规则为:
      三 个一样数字的骰子称为三条;两个一样数字的骰子称为对子;只有一个数字的骰子成为散牌。三条>对子>散牌。当双方结果都为三条时,直接比较三 条数字的大小;都有对子时,先比较对子数字的大小,若相同,再比较剩下的骰子的数字的大小;都只有散牌时,先比较最大的数字的大小,若相同,再比较次大的 数字的大小,还相同,最后比较最小的数字的大小。

      现在Nias已经投了3个骰子,还剩一次机会可以选择其中一个骰子重新投(或不选),而且他已经知道了Ains的最后投掷结果,求Nias获胜的概率有多大。
     
    Input
    输入数据第一行为一个整数T,表示有T组测试数据。
    接下来T行,每行6个1~6的整数,前三个表示Nias第一次的投掷结果,后三个表示Aias最终的投掷结果。
     
    Output
    请输出Nias获胜的概率,结果保留3位小数,每组输出占一行。
     
    Sample Input
    4 2 3 5 3 3 4 3 3 1 2 2 2 6 2 1 5 4 3 1 2 3 4 4 1
     
    Sample Output
    0.333 0.167 1.000 0.000
     
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int kind(int a[])
    {
        if(a[1]==a[3])
            return 3;
        if(a[1]==a[2]||a[2]==a[3])
            return 2;
        return 1;
    }
    
    bool compare(int a[],int b[])
    {
        sort(a+1,a+4);
        int ka=kind(a);
        int kb=kind(b);
        if(ka>kb)
            return true;
        if(ka==kb)
        {
            if(ka==3)
            {
                return a[1]>b[1];
            }
            else if(ka==2)
            {
                if( a[2]>b[2] )
                    return true;
                if(a[2]==b[2])
                {
                    if(a[1]==a[2]&&b[1]==b[2]&&a[3]>b[3])
                        return true;
                    if(a[1]==a[2]&&b[2]==b[3])
                        return true;
                    if(a[2]==a[3]&&b[2]==b[3]&&a[1]>b[1])
                        return true;
    
                }
            }
            else
            {
                for(int i=3;i>=1;i--)
                {
                    if(a[i]>b[i])
                        return true;
                    else if(a[i]==b[i])
                        continue;
                    else
                        return false;
                }
            }
        }
        return false;
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        int a[10],b[10],c[10];
        while(t--)
        {
            scanf("%d %d %d %d %d %d",&a[1],&a[2],&a[3],&b[1],&b[2],&b[3]);
            sort(a+1,a+4);
            sort(b+1,b+4);
            if(compare(a,b))
                printf("1.000
    ");
            else
            {
                int Max=0;
                for(int i=1;i<=3;i++)
                {
                    int sum=0;
                    c[0]=0;
    
                    for(int j=1;j<=6;j++)
                    {
                        c[i]=j;
                        if(compare(c,b))
                            sum++;
                        for(int j=1;j<=3;j++)
                            c[j]=a[j];
                    }
                    if(sum>Max)
                        Max=sum;
                }
                printf("%.3f
    ",Max*1.0/6);
            }
    
        }
    
    }
  • 相关阅读:
    [SDOI2017]新生舞会
    [SCOI2007]最大土地面积
    [JLOI2014]松鼠的新家
    [AHOI2009]中国象棋
    【转载】树链剖分.By.Xminh
    HGOI20180904(NOIP2018模拟sxn出题)
    HGOI20180831 NOIP2018模拟
    【字符串算法1】 再谈字符串Hash(优雅的暴力)
    【字符串算法2】浅谈Manacher算法
    【字符串算法3】浅谈KMP算法
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5005338.html
Copyright © 2020-2023  润新知