zoukankan      html  css  js  c++  java
  • 2015 HDU 计算机学院 院赛 1003 玩骰子

    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<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    int x[5],a[5],b[5];
    int T;
    int fz,fm;
    double ans;
    int flag;
    int tot;
    
    void copy()
    {
        a[1]=x[1];
        a[2]=x[2];
        a[3]=x[3];
    }
    
    int cheak()
    {
        sort(a+1,a+4);
        sort(b+1,b+4);
    
        int lva,lvb;
    
        if(a[1]==a[2]&&a[2]==a[3]) lva=3;
        else if(a[2]==a[3]||a[1]==a[2]) lva=2;
        else lva=1;
    
        if(b[1]==b[2]&&b[2]==b[3]) lvb=3;
        else if(b[2]==b[3]||b[1]==b[2]) lvb=2;
        else lvb=1;
    
        if(lva>lvb) return 1;
        else if(lva<lvb) return 0;
        else if(lva==lvb)
        {
            if(lva==3)
            {
                if(a[1]>b[1]) return 1;
                else return 0;
            }
    
            else if(lva==2)
            {
                if(a[2]>b[2]) return 1;
                else if(a[2]<b[2]) return 0;
                else 
                {
                    int u1,u2;
                    if(a[2]==a[3]) u1=a[1];
                    else u1=a[3];
    
                    if(b[2]==b[3]) u2=b[1];
                    else u2=b[3];
    
                    if(u1>u2) return 1;
                    else return 0;
                }
            }
    
            else if(lva==1)
            {
                if(a[3]>b[3]) return 1;
                else if(a[3]<b[3]) return 0;
                else
                {
                    if(a[2]>b[2]) return 1;
                    else if(a[2]<b[2]) return 0;
                    else
                    {
                        if(a[1]>b[1]) return 1;
                        else if(a[1]<b[1]) return 0;
                        else return 0;
                    }
                }
                return 0;
            }
        }
    }
    
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d%d %d%d%d",&x[1],&x[2],&x[3],&b[1],&b[2],&b[3]);
    
            copy();
            flag=cheak();
            fz=flag;
    
            if(fz) printf("1.000
    ");
    
            else if(fz==0)
            {
                ans=0;
                fm=0;
                for(int i=1;i<=3;i++)
                {
                    tot=0;
                    for(int j=1;j<=6;j++)
                    {
                        copy();
                        a[i]=j;
                        flag=cheak();
                        tot=tot+flag;
                    }
                    if(tot==0) continue;
                    ans=max(ans,1.0*tot/6);
                }
                printf("%.3lf
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    嵌入式框架Zorb Framework搭建三:列表的实现
    嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
    C#比较两个时间大小
    大数据概述
    综合练习:英文词频统计
    熟悉常用的Linux操作
    Python基础画五星红旗
    字符串、组合数据类型练习
    简化版C语言文法
    词法分析实验报告
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5005210.html
Copyright © 2011-2022 走看看