题意

有 \(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. Python2.7-os.path

    os.path 模块,实现了对文件路径的操作,但是不操作文件.由于不同系统文件路径格式不同,os.path 总是调用适合当前系统的版本,你也可以手动导入别的系统的(posixpath,ntpath,m ...

  2. 前端:background 设置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Android解决Intent中的数据重复问题

    转载地址:http://www.cnblogs.com/anrainie/articles/2383941.html 最近在研究Android,遇到了一些Notification(通知)的问题: .N ...

  4. windows linux hosts文件的配置,开发项目中域名跳转等。

    我们通常都知道Windows中hosts文件(C:\Windows\System32\drivers\etc),用来映射域名的.linux上当然也有,一般在/etc/hosts下. 当工作的项目,在开 ...

  5. 【html】前端实现筛选条件跳转

    之前与PHP的合作模式之一是前端这边负责写好静态页面交货. 那现在新进的公司,PHP说筛选由前端来实现. 嗯,好吧.实现就实现,多锻炼下咯. <div class="fliter&qu ...

  6. android环境的搭配

    android环境一般采用的是adt bundle 下载地址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 根据自己jd ...

  7. Git与TortoiseGit基本操作

    Git与TortoiseGit基本操作 1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(C ...

  8. Spark笔记(一):错误总结

    1.转义字符: 常见的replaceAll,split,mkstring中涉及到特殊字符的都要加上转义字符,比如str.split("\\|"),str.replaceAll(&q ...

  9. 20155318 Exp1 PC平台逆向破解(5)M

    20155318 Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入 ...

  10. 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果

            今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...