做网站需要,高端车品牌排行榜,织梦 企业网站,邯郸做网站多少钱Admin 生日那天#xff0c;Rainbow 来找 Admin 玩扑克牌。
玩着玩着 Rainbow 觉得太没意思了#xff0c;于是决定给 Admin 一个考验。
Rainbow 把一副扑克牌(54 张)随机洗开#xff0c;倒扣着放成一摞。
然后 Admin 从上往下依次翻开每张牌#xff0c;每翻开一张黑桃、红…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。
数据范围
0≤A,B,C,D≤15
输入样例
1 2 3 4输出样例
16.393
#includebits/stdc.h
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl \nusing namespace std;typedef pairint, int PII;
typedef long long ll;const int N 15, INF 1e20;int A, B, C, D;
double f[N][N][N][N][5][5];double dp(int a, int b, int c, int d, int x, int y)
{//if(a 13 || b 13 || c 13 || d 13)return INF;double v f[a][b][c][d][x][y];if(v 0)return v;int as a (x 0) (y 0);int bs b (x 1) (y 1);int cs c (x 2) (y 2);int ds d (x 3) (y 3);if(as A bs B cs C ds D)return v 0;int sum a b c d (x ! 4) (y ! 4);sum 54 - sum;if(sum 0)return v INF;v 1;if(a 13)v (13.0 - a) / sum * dp(a 1, b, c, d, x, y);if(b 13)v (13.0 - b) / sum * dp(a, b 1, c, d, x, y);if(c 13)v (13.0 - c) / sum * dp(a, b, c 1, d, x, y);if(d 13)v (13.0 - d) / sum * dp(a, b, c, d 1, x, y);if(x 4){double t INF;for(int i 0; i 4; i ){t min(t, 1.0 / sum * dp(a, b, c, d, i, y));}v t;}if(y 4){double t INF;for(int i 0; i 4; i ){t min(t, 1.0 / sum * dp(a, b, c, d, x, i));}v t;}return v;
}int main()
{//IOScin A B C D;memset(f, -1, sizeof f);double t dp(0, 0, 0, 0, 4, 4);if(t INF / 2)t -1;printf(%.3lf, t);return 0;
} 思路和绿豆蛙那题有点像一个点的期望等于所有 下一个点的期望乘以相应概率 之和和图沾点边。
f[a][b][c][d][x][y]
a、b、c、d分别表示每个花色对应的数量x表示大王03对应所在花色4表示在牌堆里
小王同理。