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
  • 相关阅读:
    To select the file to upload we can use the standard HTML input control of type
    Cascading Menu Script using Javascript Explained
    网站首页head区代码规范
    轻松掌握 Java 泛型
    JDK 5.0 中的泛型类型学习
    如何在firefox下获取下列框选中option的text
    是同步方法还是 synchronized 代码? 详解多线程同步规则
    javascript select option对象总结
    Select的动态取值(Text,value),添加,删除。兼容IE,FireFox
    javascript在ie和firefox下的一些差异
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5636538.html
Copyright © 2011-2022 走看看