因为题目过于大神所以单独拿出来说。而且既然下发std了颓代码貌似也不算可耻233

很难讲啊,所以还是写在代码注释里面吧

因为比较认真的写了不少注释,所以建议缩放到80%观看,或者拿到gedit上

 1 //不要在意我写的是“气”,输入法找不到那个字。。。
2 #include<cstdio>
3 #include<algorithm>
4 long double C[205][205];int n,g,t,a[205],N;
5 struct Ex{//用于存储期望值
6 long double cnt,tot;//cnt表示到达这个状态的总方案数,tot表示这些方案所获得的神的总和
7 void add(long double e,long double c){tot+=e*c;cnt+=c;}//这里是正推的,所以概率加和的结果不为1,所以期望不能直接相加
8 //期望其实类似于加权平均数。现在你有cnt个方案,和为tot。要加入c个方案,这些方案的平均数是e,所以这c个方案的和为e*c
9 //那么总的方案数就是cnt+c。总的和就是tot+e*c
10 long double E(){return cnt?tot/cnt:0;}//期望值就是总量/方案数啊,可以重载成+=,但是因为参数有2个还得写pair什么的所以就没有重载
11 }w[205][205],f[205][205];//全局变量初值为0,所以刚开始的方案数和期望值都是0
12 long double cal(int l,int r,int ord){return ord>n?0:(l+r+1)/2.0;}//计算平均数,表示用了一份l的气所得到的神的期望。
13 //如果用的是原来不存在的气,就是你加的那些编号为[n+1,n+t]的气,这些气是不存在的,所以其实你放弃了这一份精,所以并不会得到神,返回0
14 int main(){
15 freopen("surmount.in","r",stdin);freopen("surmount.out","w",stdout);
16 scanf("%d%d%d",&n,&g,&t);//方便查阅:n是气的份数,g是单次最大的精量,t是轮数
17 for(int i=1;i<=n;++i)scanf("%d",&a[i]);
18 for(int i=1;i<=n;++i)if(a[i]>g)a[i]=g;//大于g的气是没有用的,直接重置为g
19 std::sort(a+1,a+1+n);N=n+t;//排序方便处理连续的区间
20 for(int i=n+1;i<=N;++i)a[i]=g;//添加一些足够大的气,这样在下面处理的时候就能保证每一份精都能被压制
21 for(int i=0;i<=t;++i)C[i][0]=1;
22 for(int i=1;i<=t;++i)for(int j=1;j<=i;++j)C[i][j]=C[i-1][j-1]+C[i-1][j];//处理组合数
23 //w[i][j]表示对于[i,j)这段区间的所有气,如果使用了它们所获得的神的期望值
24 for(int i=0;i<=N;++i)w[i][i].add(0,1);//赋初值:空区间的方案数是1,对神的贡献为0
25 for(int i=N;~i;--i)for(int j=i+1;j<=N&&j-i<=t;++j)for(int k=i;k<j;++k)
26 w[i][j].add(w[i][k].E()+w[k+1][j].E()+cal(a[k+1],a[i],k+1),w[i][k].cnt*w[k+1][j].cnt*(a[k+1]-a[i])*C[j-i-1][k-i]);
27 //现在的操作是要把[i,k)与[k+1,j)合并成[i,j)。假设最后一个使用的精是k。注意区间开闭。
28 //add的两个参数:期望值就是[i,k)和[k+1,j)这两段的期望值的和,然而还有使用k所得到的神,你使用它是用来压制[a[k+1],a[i]]的精,得到对应的神,详见cal函数
29 //总方案数就是两边的方案相乘(乘法计数原理)。还要乘上组合数,因为要考虑这些气的顺序可以颠倒。因为左右两边内部已经有序了,所以只需要把两个混合起来。
30 //就是类似于归并排序两个内部有序的数组,总方案数就是C[j-i-1][k-i],表示在所有j-i-1个位置里选出左边所用的k-i个元素的位置,注意第k个被你强制定为最后一个了所以是j-i还要-1
31 for(int i=0;i<=t;++i)f[i][i]=w[0][i];
32 //初值,表示前i-1份气没有用。超过t没有意义。
33 for(int i=0;i<=N;++i)for(int k=0;k<=t;++k)if(f[i][k].cnt)for(int j=i+1;j<=N&&k+j-i-1<=t;++j)
34 f[j][k+j-i-1].add(f[i][k].E()+w[i+1][j].E(),f[i][k].cnt*w[i+1][j].cnt*C[k+j-i-1][k]);
35 //i表示转移之前已经用了几份气(含),j表示转移之后用的气,k表示转移了几轮,所以k+j-i-1就是转移之后已经经过了的轮数
36 //f[a][b]表示用了前a份气,已经经过了b轮之后得到的神的期望,所以最后答案是f[N][t]
37 //转移就是,先看期望,就是已经做完的f[i][k]再加上新的一轮你用了[i+1,j)这一段的气,这样所获得的神
38 //总方案数其实也一样,和w的转移比较类似,也是排序了两个内部有序的过程
39 printf("%.10Lf\n",f[N][t].E());
40 }//By DeepinC究级压行+垃圾注释(硬核25行)

累。。。

csp-s模拟测试101的T3代码+注释的更多相关文章

  1. NOIP模拟测试18(T3待更新)

    T1: 直接模拟,详见代码注释. 复杂度$O(NM)$. Code: #include<iostream> #include<cstdio> #include<vecto ...

  2. [考试反思]1105csp-s模拟测试101: 临别

    先不改题,这次主要不在T3上. 这次有必要粘文件得分了. 临考前总解锁新锅我也不知道这是什么个事啊... T1宏定义写挂.因为原来在OJ上没事所以一直没注意.在Lemon评测下直接全部RE. GG在主 ...

  3. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  4. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

  5. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  6. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  7. csp-s模拟测试95

    csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...

  8. 0823NOIP模拟测试赛后总结

    考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...

  9. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

随机推荐

  1. Java 学习笔记之 Daemon线程

    Daemon线程: 线程: 用户线程 守护线程 守护线程是一种特殊的线程,在进程中不存在非守护线程了,则守护线程自动销毁. public class DaemonThread extends Thre ...

  2. 阿里云Centos操作Mysql

    1.  CentOS7 yum方式安装MySQL5.7 2.Centos下mysql导入sql 3.Centos设置远程 4.CentOS下mysql数据库常用命令总结 5.centos出现“Fire ...

  3. 【solved】must have one register DataBase alias named `default`

    beego在初始化MySQL数据库时报错处理 1.报错提示: ... [ORM]2019/10/11 08:42:52 register db Ping `default`, dial tcp 192 ...

  4. Flutter 错误捕获的正确姿势

    背景 我们知道,在软件开发过程中,错误和异常总是在所难免. 不管是客户端的逻辑错误导致的,还是服务器的数据问题导致的,只要出现了异常,我们都需要一个机制来通知我们去处理. 在 APP 的开发过程中,我 ...

  5. 做高逼格程序员之说走就走的「Windows」

    简介:随着移动固态硬盘越来越便宜,网上逐渐出来一个黑科技.Windows To GO见名知意.简单来说就是在U盘或者是移动固态硬盘上安装Windows系统.达到即插即用. WTG 简介 Windows ...

  6. 移动端meta设置大全

    声明文档使用的字符编码:  <meta charset='utf-8'> 强制让文档与设备的宽度保持1:1,对页面设置不能进行缩放: <meta name="viewpor ...

  7. BZOJ 1965 [AHOI2005]洗牌

    题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...

  8. [ZJOI2006]物流运输trans

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  9. 窥见云技术未来大势,腾讯云Techo开发者大会即将在京召开

    云.物联网.5G.人工智能……一项项技术的突破带来了天翻地覆的变化,开发者们是如何一次次地进行天马行空的创意和极限突破?2019年11月6日-7日,由腾讯云主办的首届Techo开发者大会将在北京嘉里大 ...

  10. Python之装饰器(二)

    以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...