题意

有 \(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的更多相关文章

  1. 【Codeforces 464D】World of Darkraft - 2

    Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...

  2. Codeforces 138D World of Darkraft(Multi-Nim)

    [题目链接] http://codeforces.com/problemset/problem/138/D [题目大意] H*W的棋盘中每个点都是L.R.X三者之一,两人轮流选一个点, 若为L则向左下 ...

  3. Codeforces 138D World of Darkraft

    有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...

  4. Codeforces 1321E World of Darkraft: Battle for Azathoth

    题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...

  5. 2018省赛赛第一次训练题解和ac代码

    第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title     A CodeForces 607A Chain Reaction     B CodeForces ...

  6. World of Darkraft(codeforces 138D)

    题意:有一个 n × m 的棋盘,每个点上标记了 L; R; X 中的一个 每次能选择一个没有被攻击过的点 (i; j),从这个点开始发射线,射线形状为: 1. 若字符是 L,向左下角和右上角发,遇到 ...

  7. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  8. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  9. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

随机推荐

  1. python+requests实现接口测试 - cookies的使用 (转载)

    出自:https://www.cnblogs.com/nizhihong/p/6699492.html 在很多时候,发送请求后,服务端会对发送请求方进行身份识别,如果请求中缺少识别信息或存在错误的识别 ...

  2. SQL Prompt 智能提示插件

    1.安装及破解参照地址:http://jingyan.baidu.com/article/a3a3f811da2b3a8da3eb8a4b.html 2.安装包下载: 1)下载 2)http://do ...

  3. C++ 之const的使用

    在类中,有时候为了避免误操作而修改了一些人们不希望被修改的数据,此时就必须借助const关键字加以限定了.借助const关键字可以定义const类型的成员变量.成员函数.常对象以及对象的常引用. co ...

  4. 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)

    X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...

  5. Python3.2-re模块之常用正则记录

    python的re模块是个很好的模块,这里简单记录下自己编写的几个有用的正则: 1:邮箱匹配: gReMailbox = re.compile(r'([\w\.\-+]+@[\w\-]+(?:\.[\ ...

  6. array_reduce()使用

    这个函数的作用是,把数组中的值循环放到回调函数里处理,结果返回一个单一的值.(applies iteratively the callback function to the elements of ...

  7. 反向路径过滤——reverse path filter

    原文地址:反向路径过滤——reverse path filter 作者:pwp_cu 反向路径过滤——reverse path filter 一.原理先介绍个非对称路由的概念参考<Underst ...

  8. ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...

  9. PuTTY+Xming实现X11的ssh转发

    1 需求分析 有些Linux程序还是不能完全离开窗口环境,或者说离开后操作不方便.其中Oracle就是这样一个程序,其工具程序大多数能够在纯命令行静默执行,如 OCI,DBCA,NetCA等,但是工作 ...

  10. Scala--集合

    一.主要的集合特质 Seq有先后顺序的序列,如数组列表.IndexedSeq通过下标快速的访问元素.不可变:Vector, Range, List 可变:ArrayBuffer, LinkedList ...