zoukankan      html  css  js  c++  java
  • TYVJ 2002 扑克牌 题解

    P2002 扑克牌
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    背景

    Admin生日那天,Rainbow来找Admin玩扑克牌……
    玩着玩着Rainbow觉得太没意思了,于是决定给Admin一个考验~~~

    描述

    Rainbow把一副扑克牌(54张)随机洗开,倒扣着放成一摞。然后Admin从上往下依次翻开每张牌,每翻开一张黑桃、红桃、梅花或者方块,就把它放到对应花色的堆里去。
    Rainbow想问问Admin,得到A张黑桃、B张红桃、C张梅花、D张方块需要翻开的牌的张数的期望值E是多少?
    特殊地,如果翻开的牌是大王或者小王,Admin将会把它作为某种花色的牌放入对应堆中,使得放入之后E的值尽可能小。
    由于Admin和Rainbow还在玩扑克,所以这个程序就交给你来写了~

    输入格式

    输入仅由一行,包含四个用空格隔开的整数,A,B,C,D。

    输出格式

    输出需要翻开的牌数的期望值E,四舍五入保留3位小数。
    如果不可能达到输入的状态,输出-1.000。

    测试样例1

    输入

    样例输入1
    1 2 3 4

    样例输入2
    15 15 15 15

    输出

    样例输出1
    16.393

    样例输出2
    -1.000

    备注

    对于100%的数据,0<=A,B,C,D<=15

    lydrainbowcat - "Admin生日"杯NOIP模拟赛 第三题

    ————————————————————我是分割线————————————————————————

    好题。

    数学期望DP
    用记忆化搜索实现。

    数组竟然六维,可怕......

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include<iomanip>
     5 #include <algorithm>
     6 #include <iostream>
     7 using namespace std;
     8 double dp[15][15][15][15][5][5];
     9 bool vis[15][15][15][15][5][5];
    10 int t[4];
    11 double dfs(int a,int b,int c,int d,int e,int f)
    12 {
    13     if (vis[a][b][c][d][e][f]) return dp[a][b][c][d][e][f];
    14     if (((a+(e==0)+(f==0))>=t[0])&&((b+(e==1)+(f==1))>=t[1])&&((c+(e==2)+(f==2))>=t[2])&&((d+(e==3)+(f==3))>=t[3])) return dp[a][b][c][d][e][f]=0.0;
    15     int sum=a+b+c+d+(e!=4)+(f!=4);
    16     double F=1;
    17     if (a<13) F+=dfs(a+1,b,c,d,e,f)*(13-a)/(54-sum);
    18     if (b<13) F+=dfs(a,b+1,c,d,e,f)*(13-b)/(54-sum);
    19     if (c<13) F+=dfs(a,b,c+1,d,e,f)*(13-c)/(54-sum);
    20     if (d<13) F+=dfs(a,b,c,d+1,e,f)*(13-d)/(54-sum);
    21     double md=100; if (e==4) {for (int i=0;i<4;++i) md=min(dfs(a,b,c,d,i,f)/(54-sum),md); F+=md;}
    22            md=100; if (f==4) {for (int i=0;i<4;++i) md=min(dfs(a,b,c,d,e,i)/(54-sum),md); F+=md;}
    23     vis[a][b][c][d][e][f]=true;
    24     return dp[a][b][c][d][e][f]=F;
    25 }
    26 int main()
    27 {
    28     memset(vis,false,sizeof vis);
    29     int a,b,c,d;
    30     scanf("%d%d%d%d",&t[0],&t[1],&t[2],&t[3]);
    31     a=t[0];b=t[1];c=t[2];d=t[3];
    32     double ans=dfs(0,0,0,0,4,4);
    33     if (ans>54.0) printf("-1.000
    ");
    34     else cout<<setiosflags(ios::fixed)<<setprecision(3)<<ans;
    35 }
    tyvj 2002
  • 相关阅读:
    什么是面向对象(OOP)
    Java虚拟机(JVM)你只要看这一篇就够了!
    ES6中新增的Object.assign()方法详解
    微信小程序_专题_脚本之家(小程序全部知识点)
    微信小程序 生命周期详解
    vue 阻止事件冒泡,捕获方法
    Java必备常见单词
    JS夸页面通信极简方案&纯前端实现文件下载
    vue keep-alive以及activated,deactivated生命周期的用法
    JVM实用参数 内存调优
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5636538.html
Copyright © 2011-2022 走看看