首页 > 其他分享 >CF464D World of Darkraft - 2 题解

CF464D World of Darkraft - 2 题解

时间:2022-11-11 21:33:06浏览次数:52  
标签:概率 期望 int dfrac 装备 CF464D frac 题解 World

期望好题,可以帮助我更加深入地了解期望。

由于 \(k\) 种装备相同,所以只要计算卖掉一种装备得到的金币期望乘以 \(k\) 就行了。

为了避免讨论当前状态的概率,期望 DP 通常采用逆推的方式。

设 \(f_{i,j}\) 表示从当前打了 \(i\) 只怪兽,这种装备等级为 \(j\) 这个状态开始,最终获得金币的期望。

分类讨论贡献。

  • 有 \(\dfrac {k-1}k\) 的概率抽不到这种装备。这个时候直接从 \(f_{i+1,j}\) 继承,贡献为 \(\dfrac {(k-1)f_{i+1,j}}k\)。
  • 有 \(\dfrac j{(j+1)k}\) 的概率抽到等级不超过当前装备的同种装备,此时的贡献为 \(\dfrac {\sum_{l=1}^jf_{i+1,j}+l}{(j+1)k}=\dfrac {jf_{i+1,j}+\frac 12 j(j+1)}{(j+1)k}\)。
  • 有 \(\dfrac 1{(j+1)k}\) 的概率抽到等级为 \(j+1\) 的同种装备,此时的贡献为 \(\dfrac {f_{i+1,j+1}+j}{(j+1)k}\)。

综上,可以得出状态转移方程:

\[\begin{aligned} f_{i,j}&=\dfrac {(k-1)f_{i+1,j}}k+\dfrac {jf_{i+1,j}+\frac 12 j(j+1)}{(j+1)k}+\dfrac {f_{i+1,j+1}+j}{(j+1)k}\\ &=\dfrac{2(k-1)f_{i+1,j}}{2k}+\dfrac {2jf_{i+1,j}}{2(j+1)k}+\dfrac{j}{2k}+\dfrac {2f_{i+1,j+1}+2j}{2(j+1)k}\\ &=\frac{2(j+1)(k-1)f_{i+1,j}+2jf_{i+1,j}+j(j+3)+2f_{i+1,j+1}}{2(j+1)k}\\ &=\frac{2(kj+k-1)f_{i+1,j}+j(j+3)+2f_{i+1,j+1}}{2(j+1)k} \end{aligned} \]

发现状态是 \(\mathcal O(n^2)\) 的。怎么办呢?

我们发现如果 \(j\) 取到比较大的值时,概率是很小的。由于题目要求使用浮点数而非取模,我们可以在允许的精度范围内损失一些。所以我们为 \(j\) 设置一个上限 \(M\),舍弃后面的状态。上限越大,精度损失越小。

具体分析一下,从 \(j\) 级升到 \(j+1\) 级概率为 \(\dfrac 1{(j+1)k}\),所以期望还要打 \((j+1)k\) 个怪兽才能从 \(j\) 级升到 \(j+1\) 级。则这个装备升级到 \(t\) 的期望次数为 \(\sum_{j=2}^tjk=\dfrac k2(t+2)(t-1)\)。若这个值不超过 \(n\),则 \(t\) 的上界约为 \(500\)。我们取上界 \(M=800\) 就差不多了。

时间复杂度为 \(\mathcal O(nM)\)。本来以为不开滚动数组也能过,没想到还是 MLE 了。

不过开了滚动数组代码依然很短:

#include<cstdio>
using namespace std;
typedef double ld;
const int N=1e5+5,M=800;
int n,k;ld f[2][M+5];
int main(){
	scanf("%d%d",&n,&k);
	for(int i=n;i>=1;i--)for(int j=1;j<=M;j++){
		f[i&1][j]=(2*(k*j+k-1)*f[(i&1)^1][j]+j*(j+3)+2*f[(i&1)^1][j+1])/(2.0*(j+1)*k);
	}
	printf("%.10lf\n",f[1][1]*k);
	return 0;
}

标签:概率,期望,int,dfrac,装备,CF464D,frac,题解,World
From: https://www.cnblogs.com/hihihi198/p/16882095.html

相关文章

  • CF1316E Team Building 题解
    可能更好的阅读体验题目传送门题目大意传送门你需要组建一支排球队。为了组织一支排球队,你需要为队伍里的\(p\)个不同的位置,从\(n\)个人中选出\(p\)个人,且每个位......
  • CF1735E题解
    钦定\(p_1=0,p_2>0\),不难证明如果有解则一定存在\(p_2>p_1\)的解。考虑枚举和\(d_{1,1}\)是相同楼房,则\(p_2\)对于每一种情况有两种可能的位置:\(d_{1,1}+d_{2,i}\)......
  • P3188 [HNOI2007]梦幻岛宝珠 题解
    一道不错的dp题,下令原背包容量为\(m\)。注意到\(w_i=a\times2^b\)中\(a,b\)都比较小,尝试按照\(a\)或者\(b\)分组然后合并,但是显然如果我们按照\(a\)分组就......
  • [FastAPI-01]HelloWorld
    1.环境搭建/root/.pyenv/versions/3.9.14/bin/python3.9-mpipinstall-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com--upgradepippipinstal......
  • 汉诺塔问题及其变种问题解法(cpp版本)
    普通汉诺塔问题1.问题描述有三个柱子A、B、C,A柱子上有n个圆盘,圆盘的大小不等,大圆盘的在下,小圆盘的在上。将A柱子上的圆盘全部移动到C柱子上。每次只能移动一个圆盘,而且......
  • 【题解】P2260 [清华集训2012]模积和(数学,整除分块)
    【题解】P2260[清华集训2012]模积和比较简单的一道推式子的题。(清华集训居然会出这种水题的吗)题目链接P2260[清华集训2012]模积和题意概述求\[\sum_{i=1}^{n}\sum......
  • 【题解】CF1485C Floor and Mod(二分答案,整除分块)
    【题解】CF1485CFloorandModemmm……NOIP考前两周,跟CSP考前一样(虽然最后并没有去考),写篇题解增加以下RP(雾)。提供一篇思路大体和题解区相同但用了二分写法的题解。......
  • P2254 [NOI2005] 瑰丽华尔兹 题解
    注意到可以设朴素转移方程\(f_{t,i,j}\)表示\(t\)时刻钢琴在\((i,j)\)时的最长滑动距离,这样复杂度是\(O(nmt)\)的,过不去。不过听说加点奇怪的优化能过?考虑一段时......
  • MySQL慢查询(下):问题解决,应用总结
    上篇回顾继上两篇:​​MySQL慢查询(上):你知道为啥会慢么?​​​​MySQL慢查询(中):正确的处理姿势,你get到了吗?​​在以上两篇内容中,我们一起探索了这些内容:SQL执行过程查询SQL为什......
  • django+命令行 Helloworld程序
    这里说一下如何使用命令行的方式来构建一个Helloworld项目。当然,python和django一定要先安装。这个在另一篇中有提到,就不细细说了。一切安装完毕之后,就可以新建工程了,选择一......