首页 > 试题广场 >

牛牛与妞妞

[编程题]牛牛与妞妞
  • 热度指数: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){
        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)
#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;

int main()
{
    int a[3]={0};
    int b[3]={0};
    while(cin>>a[0])
    {
        cin>>a[1]>>a[2];
        cin>>b[0]>>b[1]>>b[2];
        vector<int> num(14,4);
        int suma=0,sumb=0;
        for(int i=0;i<3;i++)
        {   
            num[b[i]]--;
            num[a[i]]--;
            suma+=a[i];
            sumb+=b[i];
        }
        int dist=sumb-suma; 
        double out=0;
        int tp=abs(dist);
        if(dist>=0)
        {
            for(int i=1;i<=13;i++)
            {
                int cnt=0;
                for(int j=i+tp+1;j<=13;j++)
                    cnt+=num[j];
                out+=num[i]*cnt;
            }
        }
        else
        {
             for(int i=1;i<=13;i++)
             {
                 int cnt=0;
                 for(int j=i+tp;j<=13;j++)
                     cnt+=num[j];
                 out+=num[i]*cnt;
             }

        }
        out/=(46*45);
        if(dist>=0)
            cout<<setprecision(4)<<setiosflags(ios::fixed)<<out<<endl;
        else
            cout<<setprecision(4)<<setiosflags(ios::fixed)<<1.0-out<<endl;
    }
}
发表于 2018-06-30 08:53:08 回复(0)
WAK头像 WAK
输入例子1:
3 5 7
2 6 8
输出例子1:
0.3905
此时剩余:1(4),2(3),3(3),4(4),5(3),6(3),7(3),8(3),9(4),10(4),11(4),12(4),13(4)
牛牛总和15,妞妞总和16,牛牛最后一张需要比妞妞大至少2才能赢
所以牛牛赢的情况是:3_14_1/25_1/2/36_1/2/3/47_1-58_1-69_1-710_1-811_1-912_1-10;13_1-11
数量是:3*4+4*7+3*10+3*14+3*17+3*20+4*23+4*26+4*30+4*34+4*38=827
总数量是:46*45=2070
结果:827/2070 = 0.3995
为什么是0.3905?

发表于 2018-06-23 20:56:42 回复(4)
a=list(map(int,input().strip().split()))
b=list(map(int,input().strip().split()))
nums=[4 for i in range(14)]
nums[0]=0
for i in range(3):
    nums[a[i]]-=1
    nums[b[i]]-=1 #得到每张牌的剩余数
difference=sum(a)-sum(b) 
temp=[0 for i in range(14)]
for i in range(1,14):
    temp[i]=temp[i-1]+nums[i] 
sum=0
if difference>0:
    for i in range(1,14):
        sum+=(temp[min(13,i+difference-1)]-1)*nums[i]
else:
    for i in range(1,14):
        sum+=(temp[max(0,i+difference-1)])*nums[i]
print('%.4f'%(sum/2070.0)) 

发表于 2018-07-24 15:28:49 回复(0)
#include <stdio.h> int main() {     int a[4];     int b[4];     int cont[14];     int sum = 0;     float p;     scanf("%d %d %d",&a[1],&a[2],&a[3]);     scanf("%d %d %d",&b[1],&b[2],&b[3]);     for(int i =1; i<=13; i++)     {         int cont1 = 0;         for(int j=1 ;j<=3; j++){             if((a[j] == i))                 cont1++;             if((b[j] == i))                 cont1++;         }         cont[i] = cont1;     }     for(int i=1; i<=13; i++){         for(int j=1; j<=13; j++)         {             if(a[1]+a[2]+a[3]+i>b[1]+b[2]+b[3]+j){                 if(i == j)                     sum = sum +(4-cont[i])*(4-cont[j]-1);                 else                     sum = sum +(4-cont[i])*(4-cont[j]);             }         }     }     p = (float)sum/(46*45);     printf("%.4f\n",p); }

编辑于 2018-07-05 21:42:05 回复(0)
temp = [0]*14
while(1):
    c = 1
    a = list(map(int, input('牛牛:').split()))
    b = list(map(int, input('妞妞:').split()))
    nums = [4] * 14
    nums[0] = 0
    for i in a+b:
        nums[i] -= 1
        if nums[i]<0:
            print('输入有误,同一大小的牌不能多于四张')
            c = 0
            break
    if c==0:
        continue
    else:
        break

for i in range(1, 14):
    temp[i] += temp[i-1] + nums[i]
s = 0
d = sum(a)-sum(b)
if d > 0:
    for i in range(1, 14):
        s += (temp[min(i+d-1, 13)]-1)*nums[i]
else:
    for i in range(1, 14):
        s += temp[max(i+d-1, 0)]*nums[i]

res = 1.0*s/2070.0
print('%.4f' % res)

发表于 2021-07-15 15:43:38 回复(0)
#include <iostream>
using namespace std;
 
int count(int p[],int val,int len){
    int total=0;
    if(val <0) return 0;
    if(val >= len){
        for(int i=12;i>=0;--i){
            total += p[i];
        }
        return total;
    }
    else{
        for(int i=val;i>=0;--i){
            total += p[i];
        }
        return total;
    }
}
int main(){
    int nums[13] = {4,4,4,4,4,4,4,4,4,4,4,4,4};
    int a1,a2,b1,b2,c1,c2;
    cin>>a1>>b1>>c1;
    cin>>a2>>b2>>c2;
    nums[a1-1]--;
    nums[b1-1]--;
    nums[c1-1]--;
    nums[a2-1]--;
    nums[b2-1]--;
    nums[c2-1]--;
    int diff = a1+b1+c1-a2-b2-c2;
    int total_count=0;
    for(int i=12;i>=0;--i){
        if(nums[i] > 0){
            nums[i]--;
            total_count += ((nums[i]+1) * count(nums,i+diff-1,13)); 
            nums[i]++;              
        }
        else{
            continue;
        }
    }
     
    printf("%.4f",((double)total_count)/(46*45));
     
    return 0;
}

发表于 2019-02-28 21:29:49 回复(0)
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)
n = 46
cnt = [4 for i in range(14)]
x1 = list(map(int, input().split()))
x2 = list(map(int, input().split()))
for x in x1 + x2:
    cnt[x] -= 1
k = sum(x2) - sum(x1)
ans = 0.0
up, down = 0, n*(n-1)
if k>=0:
    for i in range(1, 14):
        for j in range(i+k+1, 14):
            up += cnt[i]*cnt[j]
else:
    for i in range(1, 14):
        t = cnt[i]
        s = max(i+k+1, 1)
        cnt[i] -= 1
        for j in range(s, 14):
            up += cnt[j] * t
        cnt[i] += 1
ans = up*1.0 / down
print('%.4f' % ans)

发表于 2018-07-03 17:23:30 回复(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)
import java.io.InputStream;
import java.util.Scanner;
import java.text.DecimalFormat;

public class Main {
    public static void main(String[] args){


        Scanner scanner = new Scanner(System.in);
        
          int[] arr = new int[13];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=4;
        }
        int a1=scanner.nextInt();arr[a1-1]=arr[a1-1]-1;
        int b1=scanner.nextInt();arr[b1-1]=arr[b1-1]-1;
        int c1=scanner.nextInt();arr[c1-1]=arr[c1-1]-1;
        int a2=scanner.nextInt();arr[a2-1]=arr[a2-1]-1;
        int b2=scanner.nextInt();arr[b2-1]=arr[b2-1]-1;
        int c2=scanner.nextInt();arr[c2-1]=arr[c2-1]-1;

        int sum1=a1+b1+c1;
        int sum2=a2+b2+c2;

        int dis=sum2-sum1+1; //这样才能赢,避免平局的情况
        if (dis >= 13) {
            double d=0.0000;
            DecimalFormat df = new DecimalFormat("0.0000");
            System.out.println(df.format(d));
            return;
        } else if (dis <= -13) {
            double d=1.0000;
            DecimalFormat df = new DecimalFormat("0.0000");
            System.out.println(df.format(d));
            return;
        }

        if (dis > 0) {  //sum=arr[1+1+2+1+2+3+...+1+2+3+...+13-dis]*arr[i]  /46*45
            int x=13-dis;
            int[] sum = new int[x];
            sum[0]=arr[0];
            int[] sum3 = new int[x];
            sum3[0] = arr[0] * arr[dis];
            for (int i = 1; i < x; i++) {
                sum[i]=sum[i-1]+arr[i];
                sum3[i]=sum[i] * arr[i + dis];
            }
            int finalSum=0;
            for (int i = 0; i < sum3.length; i++) {
                finalSum = finalSum + sum3[i];
            }

            double p=(float)finalSum / (46 * 45);
            DecimalFormat df = new DecimalFormat("0.0000");
            System.out.println(df.format(p));
//            System.out.println(p);
        }
        else {  //牛牛有优势
            dis = dis-1;
            dis = Math.abs(dis);//牛牛占据的优势大小。  只要牛牛的牌不小于等于妞妞 dis。 牛牛赢

            int[] sumi = new int[13];//存放妞妞的选择
            int[] sum3 = new int[13];

            for (int i = 0; i < dis; i++) {
                sumi[0] = sumi[0] + arr[i];
            }
            sum3[0] = sumi[0] * arr[0];
            sumi[0]=sumi[0]-1;  //牛牛从妞妞可以选的牌中,已经拿掉了一张
            for (int i = 1; i < 13; i++) {  //牛牛的选择,牛牛选1, 妞妞可以选1,2,3,...dis;
                if (dis + i - 1 < 13) {
                    sumi[i] = sumi[i - 1] + arr[dis+i-1];
                }else {
                    sumi[i]=sumi[i-1];
                }
                sum3[i]=sumi[i] * arr[i];
            }
            
            int finalSum=0;
            for (int i = 0; i < sum3.length; i++) {
                finalSum = finalSum + sum3[i];
            }

            double p=(float)finalSum / (46 * 45);
             DecimalFormat df = new DecimalFormat("0.0000");
            System.out.println(df.format(p));
        }
    }
}

发表于 2018-06-28 08:53:15 回复(0)
import java.util.Formatter;
import java.util.Scanner;

public class NiuNiuAndNiuNiu2 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int[] dp = new int[14];
            int[] num1 = new int[3];
            int sum1 = 0;
            for (int i = 0; i < num1.length; i++) {
                num1[i] = sc.nextInt();
                dp[num1[i]]++;
                sum1 += num1[i];
            }
            int[] num2 = new int[3];
            int sum2 = 0;
            for (int i = 0; i < num2.length; i++) {
                num2[i] = sc.nextInt();
                dp[num2[i]]++;
                sum2 += num2[i];
            }
            double valid = 0;
            double chance = 0;
            for (int i = 1; i <= 13; i++) {
                if (dp[i] == 4) {
                    continue;
                } else {
                    dp[i]++;
                    for (int j = 1; j <= 13; j++) {
                        if (dp[j] == 4) {
                            continue;
                        } else {
                            chance++;
                            if (sum1 + i > sum2 + j) {
                                valid++;
                            }
                        }
                    }
                    dp[i]--;
                }

            }
            double res = valid / chance;
            System.out.println(new Formatter().format("%.4f", res).toString());
        }
        sc.close();

    }

}
发表于 2018-06-23 12:41:58 回复(0)

热门推荐

通过挑战的用户