首页 > 试题广场 >

牛牛与妞妞

[编程题]牛牛与妞妞
  • 热度指数:783 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛与妞妞闲来无聊,便拿出扑克牌来进行游戏。游戏的规则很简单,两个人随机抽取四张牌,四张牌的数字和最大的取胜(该扑克牌总张数为52张,没有大小王,A=1,J=11,Q=12,K=13,每种数字有四张牌),现在两人已经分别亮出了自己的前三张牌,牛牛想要知道自己要赢得游戏的概率有多大。

输入描述:
输入包含两行,第一行输入三个整数a1,b1,c1(1≤a1,b1,c1≤13),表示牛牛亮出的扑克牌。第二行输入三个整数a2,b2,c2(1≤a2,b2,c2≤13),表示妞妞所亮出的扑克牌。


输出描述:
输出一个数字x(保留4位小数),表示牛牛获胜的概率。
示例1

输入

3 5 7
2 6 8

输出

0.3995
import java.util.*;
 
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        //DecimalFormat dec = new DecimalFormat("0.0000");
        int t = 0;
        int[] data = new int[14];
        for(int i=0;i<13;i++){
            data[i] = 4;
        }
        int sum1=0,sum2=0;
        double sum=0,res=0;
        
        for(int i=0;i<3;i++){
            t = in.nextInt();
            data[t-1]--;
            sum1+=t;
        }
        for(int i=0;i<3;i++){
            t = in.nextInt();
            data[t-1]--;
            sum2+=t;
        }
        
        int diff = sum1 - sum2;
        if(diff>=13){
            System.out.printf("%.4f\n",1.0000);
            return;
        }
        if(diff<=-13){
            System.out.printf("%.4f\n",0.0000);
            return;
        }
        
        if(diff<=0){
            for(int i=0;i<13;i++){
                for(int j=i-diff+1;j<13;j++){
                    sum+=data[i]*data[j];
                    //System.out.print((i+1)+"-->"+(j+1)+"  ");
                }
            }
            res = sum/(46*45);
            //String result = dec.format(res);
            System.out.printf("%.4f\n",res);
            return;
        }
        
        if(diff>0){
            for(int i=0;i<13;i++){
                if(i+diff<13){
                    for(int j=0;j<i+diff;j++){
                        if(j==i){
                            t = data[j]-1;
                            sum+=data[i]*t;
                        }
                        else sum+=data[i]*data[j];
                    }
                }
                else{
                    for(int j=0;j<13;j++){
                        if(j==i){
                            t = data[j]-1;
                            sum+=data[i]*t;
                        }
                        else sum+=data[i]*data[j];
                    }
                }
            }
            res = sum/(46*45);
            System.out.printf("%.4f\n",res);
            return;
        }
        in.close();
    }
}


编程小白只会这样码代码。。。

发表于 2018-10-07 12:39:58 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int i=1;i<=13;i++){
            map.put(i,4);
        }
        int sum1=0;
        int sum2=0;
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<6;i++){
            Integer key=sc.nextInt();
            if(i<3)
                sum1+=key;
            else
                sum2+=key;
            
            map.put(key,map.get(key)-1);
        }
        int num=0;
        for(Map.Entry<Integer,Integer> M:map.entrySet()){
            if(M.getValue()==0)
                continue;
            map.put(M.getKey(),M.getValue()-1);//这里的M.getValue() 会取到跟新后的值
            for(Map.Entry<Integer,Integer> m:map.entrySet()){
                if(m.getValue()==0)
                    continue;
                if(m.getKey()+sum2<M.getKey()+sum1)
                    num+=m.getValue()*(M.getValue()+1);//千万注意这里 刚拿走一 这里要加上
            }
            map.put(M.getKey(),M.getValue()+1);//拿走后 这里要加上
        }  
        System.out.printf("%.4f\n", num*1.0/(46*45));
    }
}

发表于 2018-07-03 23:14:31 回复(0)
import java.util.*;
public class CardProb {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int num[] = new int[14], accum[] = new int[14], sum, i, dif, tem;
    sum = dif = 0;
    Arrays.fill(num, 1, 14, 4);//共有13个数字,每个数字有4张
    for (i = 0; i < 6; ++i) {
      tem = sc.nextInt();
      num[tem]--;
      dif += (i < 3 ? tem : -tem);//计算亮出6张后两边的数字和之差
    }
    for (i = 1; i < 14; ++i)
      accum[i] = accum[i-1] + num[i];//accum[i]:6张外小于等于i的牌的张数
    if (dif > 0) {
      for (i = 1; i < 14; ++i)//dif大于0时要减掉牛牛拿的最后一张
        sum += (accum[Math.min(13, i+dif-1)] - 1) * num[i];
    } else {
      for (i = 1; i < 14; ++i)//dif小于等于0时不必考虑牛牛的最后一张
        sum += accum[Math.max(0, i+dif-1)] * num[i];
    }
    System.out.printf("%.4f\n", (double)sum / (45 * 46));//45,46=52-7,6
  }
}

发表于 2018-06-29 17:07:33 回复(0)

热门推荐

通过挑战的用户

相关试题