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\n");
34     else cout<<setiosflags(ios::fixed)<<setprecision(3)<<ans;
35 }

tyvj 2002

时间: 2024-10-15 04:15:42

TYVJ 2002 扑克牌 题解的相关文章

TYVJ P2002 扑克牌

背景 Admin生日那天,Rainbow来找Admin玩扑克牌……玩着玩着Rainbow觉得太没意思了,于是决定给Admin一个考验~~~ 描述 Rainbow把一副扑克牌(54张)随机洗开,倒扣着放成一摞.然后Admin从上往下依次翻开每张牌,每翻开一张黑桃.红桃.梅花或者方块,就把它放到对应花色的堆里去.Rainbow想问问Admin,得到A张黑桃.B张红桃.C张梅花.D张方块需要翻开的牌的张数的期望值E是多少?特殊地,如果翻开的牌是大王或者小王,Admin将会把它作为某种花色的牌放入对应堆

TYVJ计算几何

今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基本上没用,每次都把上次的main()函数删了接着继续写.... 原谅我曾经丑出翔的代码... 虽然现在也很丑... TYVJ 1543 房间最短路 题解: Floyd,dp[i][j]表示到第i面墙的第j个点的最短路,注意在更新最小值的时候判断两个点的连通 1 #include <cstdio>

待簳的题......

HDU 4901 POJ 1015 TYVJ 1864 TYVJ 1933 TYVJ 2002 POJ 1737 CF 313 div.1 C Nescafé2 月之谜 POJ 2288 TYVJ 1051 HDU bobo IOI island

POJ1325 Machine Schedule

Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15700   Accepted: 6734 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduli

[POJ 1330] Nearest Common Ancestors (朴素方法)

POJ 1330: Nearest Common Ancestors Time Limit: 1000ms Memory Limit: 32Mb Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:  In the figure, each node is labeled with an integer fro

1099 字串变换

1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’-&

1540 银河英雄传说

1540 银河英雄传说 2002年NOI全国竞赛 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,

POJ1422 Air Raid

Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8625   Accepted: 5155 Description Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an i

【题解】扑克牌游戏

[题解]扑克牌游戏 假如我们知道一个答案,那么我们剩下的问题就是去检查这个答案是否合法. 显然可以拿\(m\)做文章,假设我们最终可以得到\(ans\)组套牌,那么对于每张牌,如果它的数量比\(ans\)小,我们就需要拿\(joker\)补.多的就没关系了. 很棒的思路,还有一个贪心做法,也很神仙.orz #include<bits/stdc++.h> #define R register int #define gc getchar using namespace std; typedef