Codeforces 464D-World of Darkraft - 2
题意
有 \(n\) 个怪兽,\(k\) 种装备。最开始每个装备的等级都是 1 。每打完一个怪兽就会随机掉落一个装备。
随机的方式是,先等概率随机一个装备种类,设当前这个装备的等级为 \(t\) ,那么再在 \([1,t+1]\) 中随机一个装备等级。
我们会在这两个装备中选择等级高的那个获得,另一个卖掉,得到等级数量的金币。
求最后金币的期望值。需要误差在 \(10^{-9}\) 以内。
\(n\le 10^5,k\le 100\) 。
分析
显然 \(k\) 个装备是等价的,所以直接算一个的情况就行了。
我们要求的是总金币数量的期望,分成每次操作完之后的得到金币期望数量和来计算。
可以发现一个性质:若当前装备的等级为 \(x\) ,那么一次操作完后期望得到的金币数量为 \(\frac{x}{x+1}+\frac x 2\) 。
现在问题就变成计算每次操作前的装备等级 \(x\) 的期望和 \(\frac x {x+1}\) 的期望。
很容易用一个 \(O(n^2)\) 的dp来计算进行完前 \(i\) 次操作后装备等级为 \(j\) 的概率,然后就可以得到上面两个东西的期望值,即可算出答案。
显然会超时。然后就不会了。
注意到,有一个误差的阈值,那么不如看看能不能减少一些情况。可以发现,当装备等级为 \(x\) 的时候,升级的概率为 \(\frac 1 {k(x+1)}\) ,所以升级的期望步数为 \(k(x+1)\) ,因此升级到 \(x\) 级的期望步数 \(f(x)\sim kx^2\) 。
也就是说,只需要计算大概 \(\sqrt n\) 左右的等级即可!
复杂度为 \(O(n\sqrt n)\) ,空间用滚动数组优化。
代码
#include<bits/stdc++.h>
using namespace std;
typedef double lb;
const int maxn=1e5+1;
const int thel=620,maxl=thel+1;
int n,k,m;
lb ok,mk,h[maxl],d[maxn],o[maxn],ans=0;
lb yp[maxl],y[maxl];
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
cin>>n>>k;
m=min(n,thel);
ok=1.L/k,mk=1.L-ok;
for (int i=1;i<=thel;++i) yp[i]=(lb)i/(i+1),y[i]=1.L/i;
h[1]=1;
d[0]=1,o[0]=0.5;
for (int i=1;i<n;++i) {
for (int j=m;j;--j) (h[j]*=ok*yp[j]+mk)+=h[j-1]*y[j]*ok;
for (int j=1;j<=m;++j) d[i]+=h[j]*j,o[i]+=h[j]*yp[j];
}
for (int i=1;i<=n;++i) ans+=d[i-1]/2+o[i-1];
cout<<fixed<<setprecision(12)<<ans<<endl;
return 0;
}
Codeforces 464D-World of Darkraft - 2的更多相关文章
- 【Codeforces 464D】World of Darkraft - 2
Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...
- Codeforces 138D World of Darkraft(Multi-Nim)
[题目链接] http://codeforces.com/problemset/problem/138/D [题目大意] H*W的棋盘中每个点都是L.R.X三者之一,两人轮流选一个点, 若为L则向左下 ...
- Codeforces 138D World of Darkraft
有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...
- Codeforces 1321E World of Darkraft: Battle for Azathoth
题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...
- 2018省赛赛第一次训练题解和ac代码
第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title A CodeForces 607A Chain Reaction B CodeForces ...
- World of Darkraft(codeforces 138D)
题意:有一个 n × m 的棋盘,每个点上标记了 L; R; X 中的一个 每次能选择一个没有被攻击过的点 (i; j),从这个点开始发射线,射线形状为: 1. 若字符是 L,向左下角和右上角发,遇到 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
随机推荐
- 关于this指向,翻到的
关于JavaScript函数执行环境的过程,IBM developerworks文档库中的一段描述感觉很不错,摘抄如下: “JavaScript 中的函数既可以被当作普通函数执行,也可以作为对象的方法 ...
- python基础2之字符串、列表、字典、集合
内容概要: 一.python2 or 3 二.字符串拼接 三.字符串 四.列表.元祖 五.字典 六.集合 七.练习 一.python2 or python3 目前大多使用python2.7,随着时间的 ...
- 20155209 林虹宇Exp2 后门原理与实践
Exp2 后门原理与实践 实验内容 一.使用netcat获取主机操作Shell,cron启动 使用netcat获取主机操作Shell Win获得Linux Shell 查看win的ip地址 windo ...
- 20155310 Exp9 Web安全基础实践
20155310 Exp9 Web安全基础实践 基础问题 SQL注入攻击原理,如何防御? SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞.也就是,在输入字符串中嵌入SQL指令,在 ...
- Android开发——Android进程保活招式大全
)前台进程(Foreground process),即用户当前操作所必需的进程,通常数量不多.举例如下: //拥有用户正在交互的 Activity(已调用 onResume()) //拥有某个 Ser ...
- 汇编 do while循环
do while生成的汇编代码 do while汇编还原成C++代码 一. do while成生的汇编代码 // int i=0; // do // { // i++; // } while ( ...
- WinDbg命令三部曲
WinDbg 命令三部曲:(一)WinDbg 命令手册 WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册 WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册
- cocos2d-x学习记录1——图片显示
这篇算是cocos2d-x入门篇,显示一张图片即可. 观察工程中HelloWorld的结构,包含AppDelegate和HelloWorldScene两个类文件,AppDelegate中包含基本的处理 ...
- 分布式Redis缓存串讲(一)
互联网应用的基石 现在流量稍微大些的网站,都会采取Redis.基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋.既然Redis这么重要,我们从 ...
- CSS快速入门-前端布局2(唯品会1)
上一篇我模仿了抽屉网站,这一节我来对唯品会主页进行模仿. 我觉得写一个主页大概思路如下: 1.确定整体布局方式:(html框架布局) 2.针对每一块进行细化,尽量做到模块化.(css) 3.加上特效效 ...