TopCoder SRM420 Div1 500pt RedIsGood
桌面上有R 张红牌和B 张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1 美元,黑牌则付出1 美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
R,B ≤ 100000.
输入格式:
若干行,每行两个整数R,B
输出格式:
一个实数期望值.
样例输入:
68 7
样例输出
61.103
分析:这道题加深了我对期望+dp的理解.考虑dp,设f[i][j]表示还剩下i张红牌j张黑牌的期望值,这个时候如果停止翻牌,那么f[i][j] = 0,如果继续翻牌,就有i/i+j的概率翻到红牌,j/i+j的概率翻到黑牌,那么f[i][j] = (f[i-1][j] + 1) * i/(i + j) + (f[i][j-1] - 1) * j/(i + j).
这个时候我就有点疑惑了,为什么这个方程的期望值f[i-1][j],f[i][j-1]要乘上概率而noip2016d1t3那道题不需要呢?经过长时间的思索,我终于明白了,换教室那道题不用乘概率是因为那是两个不同的决策,它们并不在同一个决策里,而这一题要么不翻,要么翻,而实际上期望都在同一个决策里,所以有几率翻到红牌或者黑牌,所以要乘上概率.
一般期望题首先要考虑有没有公式,然后试试dp,dp的话一边直接用期望值表示状态.
数据过大,用了滚动数组.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; int r,b,last = ,now = ; const int maxn = 1e5+; double f[][maxn]; int main()
{
while (scanf("%d%d",&r,&b))
{
memset(f,,sizeof(f));
for (int i = ; i <= r; i++)
{
f[now][] = i;
for (int j = ; j <= b; j++)
f[now][j] = max(0.0,(f[last][j] + ) * i/(i + j) + (f[now][j-] - ) * j / (i + j));
swap(now,last);
}
printf("%.3lf\n",f[last][b]);
} return ;
}
TopCoder SRM420 Div1 500pt RedIsGood的更多相关文章
- TopCoder SRM420 Div1 RedIsGood —— 期望
题目链接:https://vjudge.net/problem/TopCoder-9915 (论文上的题) 题解: 更正:, i>0, j>0 代码如下: #include <ios ...
- SRM DIV1 500pt DP
SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...
- TopCoder 649 div1 & div2
最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...
- TopCoder SRM500 Div1 250 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...
- TopCoder SRM500 Div1 500 分治
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-500.html SRM500 Div1 500 没想到 double 的精度居然没有爆-- 考虑以 ...
- TopCoder SRM500 Div1 1000 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-1000.html SRM500 Div1 1000 设 \(v_1,v_2,\cdots ,v_9 ...
- TopCoder SRM502 Div1 500 贪心 01背包
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-500.html SRM502 Div1 500 好题. 首先,如果已经确定了解决所有问题的优先级, ...
- TopCoder SRM502 Div1 1000 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...
- topcoder SRM712 Div1 LR
题目: Problem Statement We have a cyclic array A of length n. For each valid i, element i-1 the l ...
随机推荐
- Redis5.0:现公测全免费,点击就送,注册账号,即开即用
华为云分布式缓存服务Redis,是华为云服务的一款核心产品. 分布式缓存Redis是一款内存数据库服务,基于双机热备的高可用架构,提供单机.主从.集群等丰富类型的缓存类型. 现推出最新版本Redis5 ...
- Leetcode_2. Add_Two_Number
2. Add_Two_Number 用两个非空链表分别表示两个非负整数,链表的节点表示数字的位,链表头表示数字的低位,链表尾表示数字高位.求两个链表所表示数字的和. 比如: Input: (2 -&g ...
- Live Archive 训练题 2019/3/9
7454 Parentheses A bracket is a punctuation mark, which is used in matched pairs, usually used withi ...
- 敏捷开发与xp实践 实验报告
20162315 敏捷开发与xp实践 实验报告 实验任务 1.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好 ...
- fast-IO
代码: int Scan() //输入外挂 { ,ch,flag=; if((ch=getchar())=='-') flag=; ') res=ch-'; ') res=res*+ch-'; ret ...
- Android 8悬浮窗适配
背景 APP推出时,提示是退出还是更改账号,这个提示框是系统级别的.然而我的Android 9 会崩溃,宁外一个小伙伴Android 7运行理想.报错提示permission denied for w ...
- lintcode-511-交换链表当中两个节点
511-交换链表当中两个节点 给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点.保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做. 注意事项 你需要交换两个 ...
- Struts2(二)
以下内容是基于导入struts2-2.3.32.jar包来讲的 1.关于StrutsPrepareAndExecuteFilter 启动StrutsPrepareAndExecuteFilter时加载 ...
- 敏捷冲刺Day7
一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 第一阶段的测试 全部队员对各个方面进行深入检查,找出细节问题 4. 工作中遇到的困难 工作中的困难:对自己做出来的产品进行否定.以求 ...
- 关于 Oracle Preinstallation RPM
About the Oracle Preinstallation RPM 来源 https://docs.oracle.com/en/database/oracle/oracle-database/1 ...