CF464D World of Darkraft - 2
Roma 在游戏“World of Darkraft”(理论上应该是 World of darkcraft,MineCraft 的一个版本)找到一个新角色。 \(\mathrm{Roma}\) 有 k种装备,一开始每种装备各有 1个,且每种装备的初始等级均为 1。
游戏中可以靠打怪来获取新装备,总共有 n 只怪兽,每打赢 1 只怪兽后,\(\mathrm{Roma}\) 会随机获得一种装备 \(a\) (a∈[1,k]),假设原有的 a 装备的等级为 t,那么新获得的装备的等级为 [1,t+1],\(\mathrm{Roma}\) 会将新获得的装备和原来的装备中等级较高的装备留下,等级较低的装备卖出,卖出可获得的金币为该装备的等级。 问打完这 n只怪兽后,\(\mathrm{Roma}\) 获得的金币的期望。 \(1<=n<=10^5,1<=k<=10^3\)
Sample Input
input1
1 3
input2
2 1
input3
10 2
Sample Output
output1
1.0000000000
output2
2.3333333333
output3
15.9380768924
这道题我们考虑概率DP
设dp[i][j]表示打赢只要求出了前i只怪兽后某种装备被替换后价值为j的期望。
为什么是某装备?
因为所有装备的期望值是相同的,所以我们只要求出一种装备的期望,再乘上k即可。
有两种情况:
1.爆出了等级为j+1的神装。(概率为\(1/(j+1)\))
dp[i][j]+=(dp[i-1][j-1]+j)/j+1。
2.只得到等级<=j的装备。(概率为\(j/(j+1)\))
dp[i][[j]+=(dp[i-1][j]+(j+1)/2)*j/(j+1);//因为1至j是等概率出现的,所以取平均(j+1)/2。
但是这样你打出来你会发现自己MLE或TLE了,为什么?
i过于大,j也过于大。
优化:1.dp[i][j]的更新只需要他前一个的情况,所以我们可以考虑用滚动数组记录。
2.因为这个状态的转移是会收敛的,所以j越大他所产生的变化就越小,最终小到可以忽略不计,所以j只用取到很小就可以当作答案用了(有很多神仙j取600就过了,不过保险起见最好取1000)。
#include<bits/stdc++.h>
using namespace std;
int n,k,s=1;
double dp[2][1010];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++,s^=1)
{
for(int j=min(n,1000);j;j--)
{
dp[s][j]=((dp[s^1][j+1]+j)/(j+1.0)+(dp[s^1][j]+(j+1)/2.0)*j/(j+1.0))/double(k)+dp[s^1][j]*(k-1.0)/double(k);
}
}
printf("%.11lf\n",dp[s^1][1]*k);
return 0;
}
CF464D World of Darkraft - 2的更多相关文章
- [codeforces464D]World of Darkraft - 2 概率期望
D. World of Darkraft - 2 time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Codeforces 138D World of Darkraft
有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...
- 【Codeforces 464D】World of Darkraft - 2
Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...
- Codeforces 464D-World of Darkraft - 2
题意 有 \(n\) 个怪兽,\(k\) 种装备.最开始每个装备的等级都是 1 .每打完一个怪兽就会随机掉落一个装备. 随机的方式是,先等概率随机一个装备种类,设当前这个装备的等级为 \(t\) ,那 ...
- CF138D World of Darkraft
$ \color{#0066ff}{ 题目描述 }$ n*m的格子,每个格子有字符'L','R',X',初始可以选择所有格子. 当选了 'L'的格子时,当前格子左下右上这条线上所有点不能选; 当选了 ...
- Codeforces 138D World of Darkraft(Multi-Nim)
[题目链接] http://codeforces.com/problemset/problem/138/D [题目大意] H*W的棋盘中每个点都是L.R.X三者之一,两人轮流选一个点, 若为L则向左下 ...
- World of Darkraft(codeforces 138D)
题意:有一个 n × m 的棋盘,每个点上标记了 L; R; X 中的一个 每次能选择一个没有被攻击过的点 (i; j),从这个点开始发射线,射线形状为: 1. 若字符是 L,向左下角和右上角发,遇到 ...
- Codeforces 1321E World of Darkraft: Battle for Azathoth
题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...
- CF1320C World of Darkraft: Battle for Azathoth
线段树 又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫 CF1295E 可以发现可以打败怪兽的关系类似二维偏序 那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序 把所有的怪兽以防御 ...
随机推荐
- Node.js入门教程 第三篇 (模块及路由)
Node.js的模块 Node.js的模块与传统面向对象的类(class)不完全相同.Node.js认为文件即模块,即一个文件是一个模块.单一文件一般只专注做一件事情,保证了代码的简洁性. 创建模块: ...
- QR 码详解(下)
快速响应矩阵码(下) 书接上回,继续下半场. 纠错码 QR 码采用纠错算法生成一系列纠错码字,添加在数据码字序列之后,使得符号可以在遇到损坏时可以恢复.这就是为什么二维码即使有残缺也可以扫出来.没有残 ...
- 【TencentOS tiny】深度源码分析(4)——消息队列
消息队列 在前一篇文章中[TencentOS tiny学习]源码分析(3)--队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的, ...
- Stock Charts
Description You're in the middle of writing your newspaper's end-of-year economics summary, and you' ...
- MySQL基础(五)常见运算符
MySQL常见运算符 运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算.常见的运算有数学计算.比较运算.位运算以及逻辑运算.运用运算符可以更加灵活地使用表中的数据,常见的运算符类型有 ...
- 最简单的ArcGIS Engine应用程序(上)
名词: IWorkspaceFactory 工作空间工厂 ShapeFileWorksapceFactory 矢量文件工作空间工厂 IWorkspce 工作空间 IFeatrueWorkspace 要 ...
- django中app分组
08.13自我总结 django中app分组 一.django路由系统app进行分组 1.创建app 使用pycharm创建django的时候, 加上app的名字,后续多个app只需复制粘贴之前app ...
- [USACO10NOV]奶牛的图片Cow Photographs
题目描述 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片,这样他就可以向他的朋友炫耀他的奶牛. 这N只奶牛被标号为1..N. 在照相的那一天,奶牛们排成了一排 ...
- [BZOJ1833][ZJOI2010]数字计数
Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...
- Spring Cloud Alibaba学习笔记(23) - 调用链监控工具Spring Cloud Sleuth + Zipkin
随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求陷入性能瓶颈或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何 ...