hihocoder1489 Legendary Items 概率期望
Little Hi is playing a video game. Each time he accomplishes a quest in the game, Little Hi has a chance to get a legendary item.
At the beginning the probability is P%. Each time Little Hi accomplishes a quest without getting a legendary item, the probability will go up Q%. Since the probability is getting higher he will get a legendary item eventually.
After getting a legendary item the probability will be reset to ⌊P/(2I)⌋% (⌊x⌋ represents the largest integer no more than x) where I is the number of legendary items he already has. The probability will also go up Q% each time Little Hi accomplishes a quest until he gets another legendary item.
Now Little Hi wants to know the expected number of quests he has to accomplish to get N legendary items.
Assume P = 50, Q = 75 and N = 2, as the below figure shows the expected number of quests is
2*50%*25% + 3*50%*75%*100% + 3*50%*100%*25% + 4*50%*100%*75%*100% = 3.25

题意:要获取 N 个物品(1e6个),初始获得概率是 P %,每当上次没有获取,这次的获得概率会线性增加 Q%,直至达到 100% 则必定获取。而每当获取一个时,下一次的初始概率会下降,降低至 P / (2^l)%,l 是已经获取的个数,P 是之前给定的初始概率。问获取 N 个的期望次数是多少。
这个题大概是微软的一道笔试题吧,貌似数据是随机的所以没有极限数据,我dfs+结论卡过去了一遍,后来又发现正解。
由于后面的初始概率是按照已获取的个数定的,个数越多概率越小,由于题目最开始的 p 最大仅100,因此至多 7 层之后初始概率就都是 0 了。
我最开始考虑当概率是 0 的时候,毫无疑问,每获取一个的次数期望都是固定的,我可以用一次循环直接求出这个期望次数。然后就通过类似图中的概率树的 dfs ,每当遇到一个下一次初始概率为 0 的位置时,就可以直接加上剩余需要获取的个数*获取每一个的期望,后面就不用 dfs 下去了。
这种做法其实就可以通过这题的数据了。但是这样做通不过大数据,100 1 1000000
当然,按照上述思路拓展一下,我们同样可以求出概率是任意值时获得下一个的期望,因为这个概率的范围只有 0~100 。其实我们发现图中那两个标号 1 的节点子树是一样的,它们获取下一个物品的情况和期望都是一样的。我本来在考虑不同情况下拿到第一个,开始拿第二个,第二个和第一个是不是独立的?但是其实所有情况下拿到第一个的概率总和是1,所以无论 dfs 的哪一个分支,最后都会到同一个初始概率去获取第二个,所以获取第二个的期望与第一个是独立可加的,所以我计算出所有初始概率下获取一个的期望,然后对于初始概率 P 跑一个循环,累计期望,然后计算下一次的初始概率,直到下一次的初始概率为 0 ,那么后面的就直接个数乘期望就能跳出循环了。
因此这样做复杂度大概就是 O(100*100+7)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std; const int maxn=1e6+;
const int INF=0x3f3f3f3f;
const int mod=1e9+;
double ans=;
double num[] = {};
int n,p,q; int main(){
scanf("%d%d%d",&p,&q,&n);
for(int pre = ; pre <= ; ++ pre ){
int cnt = ;
double p1 = ;
while(){
double xq = ( pre + cnt * q) / 100.0;
if( pre + cnt * q >= ){
num[pre] += ( cnt + ) * p1 ;
break;
}
num[pre] += p1 * xq * ( cnt + );
p1 *= ( - xq );
cnt++;
}
} int pre = p;
for(int i = ; i <= n ; ++ i ){
if( pre == ){
ans += ( n - i + ) * num[];
break;
}
ans += num[pre];
pre >>= ;
} printf("%.2lf\n",ans);
return ;
}
hihocoder1489 Legendary Items 概率期望的更多相关文章
- hihocoder1489 Legendary Items (微软2017年预科生计划在线编程笔试)
http://hihocoder.com/problemset/problem/1489 笔试题第一道,虽然说第一道都很水,但是我感觉这题不算特别水把..这道题我就卡住了我记得,tle,最后只有30分 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- uvalive 7331 Hovering Hornet 半平面交+概率期望
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...
- OI队内测试一【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...
- 2016 多校联赛7 Balls and Boxes(概率期望)
Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...
- 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp
题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...
- [LnOI2019]加特林轮盘赌(DP,概率期望)
[LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
随机推荐
- 0-MAVEN SETTING
localRepository : 表示本地库的保存位置,也就是maven主要的jar包保存位置,默认在${user.dir}/.m2/repository,如果需要另外设置,就换成其他的路径 Ser ...
- 网口扫盲二:Mac与Phy组成原理的简单分析
1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. MAC(Medi ...
- U深度U盘安装win7系统教程
① 使用u深度u盘启动盘制作工具制作好的启动u盘 点击查看 ==>u深度u盘启动盘制作教程 ② ghost win7系统镜像文件(自可上网自行搜索ghost xp系统) 第一步:下载win7系统 ...
- zookeeper:shell操作以及可视化工具的使用
1.zkcli.sh基本使用 1-1 查看节点 进入zk的bin目录下执行./zkCli.sh ls命令可以查看节点,/zookeeper/quota是默认的节点 1-2新增节点 create key ...
- WPS处理个人信息一种方法
下面是WPS处理个人信息的方法,具体步骤如下: 第一步:任意打开一个文件: 第二步:点击左上角WPS的小三角,找到工具——选项,如图: 第三步:进入选项后,点击用户信息: 第四步:修改个人信息,用户名 ...
- day040 数据库索引补充 存储过程 事务等
1.正确使用索引 视图: 关键词 view 视图是体格虚拟表 创建视图 : create view 视图名称 as sql语句; 例: create view t_view as select * f ...
- libiconv库的安装和使用
1.libiconv包的下载路径 包的下载页面http://www.gnu.org/software/libiconv/ 2.编译安装libiconv库 $tar zxvf libiconv-1.14 ...
- 十. Python基础(10)--装饰器
十. Python基础(10)--装饰器 1 ● 装饰器 A decorator is a function that take a function as an argument and retur ...
- C语言进度条实现。(转)
#include <stdio.h> #include <windows.h> //跟新进度条函数 /* * 每传入一个参数就刷新一次进度条 * 当i*<=percent ...
- springmvc添加定时任务
springmvc.xml文件中添加如下配置 <bean id="ClearTempRoomLogTask" class="com.test.listener.St ...