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 概率期望的更多相关文章

  1. hihocoder1489 Legendary Items (微软2017年预科生计划在线编程笔试)

    http://hihocoder.com/problemset/problem/1489 笔试题第一道,虽然说第一道都很水,但是我感觉这题不算特别水把..这道题我就卡住了我记得,tle,最后只有30分 ...

  2. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  3. uvalive 7331 Hovering Hornet 半平面交+概率期望

    题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...

  4. OI队内测试一【数论概率期望】

    版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...

  5. 2016 多校联赛7 Balls and Boxes(概率期望)

    Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...

  6. 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  7. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  8. [LnOI2019]加特林轮盘赌(DP,概率期望)

    [LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...

  9. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

随机推荐

  1. jquery radio使用

    var list= $('input:radio[name="list"]:checked').val();

  2. 【原创】QString 函数 replace()indexOf()、 lastindexOf()

    1.替换函数 示例: QString x = "Say yes!"; QString y = "no"; x.replace(, , y); // x == & ...

  3. X86汇编语言实现的贪吃蛇游戏

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. (C/C++学习笔记) 七. 类型转换

    七. 类型转换 ● 隐式类型转换 隐式类型转换 implicit type conversions #include<iostream> using namespace std; void ...

  5. jdk8-stream的api

    1.stream流的概念 1.流的创建 //1. 创建 Stream @Test public void test1(){ //1. Collection 提供了两个方法 stream() 与 par ...

  6. 界面控件DevExpress发布v18.2.5|附下载

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  7. JS日期工具类(转)

    javascript Date format(js日期格式化) https://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.htm ...

  8. for&while循环

    流程控制: 1. if 2. while 3. for if判断 什么是if判断 判断一个条件成立则做...不成了则做... 为何要有if判断 让计算机像人一样具有判断的能力 什么是循环 循环指的是一 ...

  9. 用optional取代null

    Java8引入了java.util.Optional<T>,它是一个封装的Optional值的类.变量存在时,Optional类只是对类简单封装.变量不存在时,缺失的值会被建模成一个空的O ...

  10. Linux 下各个目录的作用及内容

    在 Linux 下,我们看到的是文件夹(目录): 在早期的 UNIX 系统中,各个厂家各自定义了自己的 UNIX 系统文件目录,比较混乱.Linux 面世不久后,对文件目录进行了标准化,于1994年对 ...