[JLOI2012]时间流逝 树上高斯消元 概率期望
题面
题意:(感觉题面写的题意是错的?)有\(n\)种能量不同的圈,设当前拥有的圈的集合为\(S\),则:
1,每天有\(p\)概率失去一个能量最小的圈。特别的,如果\(S = \varnothing\),那么这个概率为0.
2,否则将得到一个满足\(能量 \le S_{min}\)的圈。
求\(S\)内的能量和大于\(T\)的期望天数。
题解:出于期望要倒推的考虑,我们设\(f[i]\)表示从状态\(i\)到合法状态的期望。
一个能量和大于\(T\)的状态为合法状态,显然有\(f[合法状态] = 0\),现在我们要求的是\(f[\varnothing].\).
令\(last(i)\)表示状态\(i\)通过删去一个圈可以到达的状态。\(next(i)\)表示状态\(i\)通过获得一个圈可以到达的状态。我们可以列出如下等式:
\]
高斯消元?但状态好像太多了,,,权值和为\(50\)的不同集合个数大概在\(1e5\)的级别,\(n^{3}\)不可能过。所以我们考虑优化。
因为对于一个集合\(S\),去掉一个圈可以到达的状态是唯一确定的,因此\(last(s)\)只有一个,但\(next(s)\)有多个。
所以如果我们将\(last(s)\)视作\(s\)的父亲,\(next(s)\)视作\(s\)的儿子,那么我们可以发现,以状态之间的关系为边,可以构建出一棵树。
如果我们可以把\(f[i]\)表示为\(k \cdot f[fa(i)] + b\)的形式,那么对于任意一个点,我们将它子树所表示出的所有式子带入消值,可以使得当前点的式子中最多只有\(f[i]\)和$f[fa(i)]$2个状态。
我们考虑用归纳法来证明这是可行的:
1,对于叶子节点(合法状态),因为它本身就没有儿子,因此一开始就只有自己和父亲2个状态,显然可以表示成所需状态。
2,对于非叶节点,考虑证明当儿子满足条件时,这个节点一定满足条件。
\]
其中\((1 - p) \frac{1}{|next(i)|}\)是一个定值,我们设它为\(G\).那么:
\]
变成高斯消元的形式:
\]
其中,因为\(i\)的儿子,也就是\(next(i)\)会被转化为\(k \cdot f[i] + b\)的性质,因此当我们把\(next(i)\)全都带入进来后,剩下的式子应该是类似这样的.其中\(f[i]\)的系数和常数项被改变,于是得到:
\]
稍微化简一下可以得到:
\]
设\(t_{1} = \frac{p}{k_{1}}, t_{2} = \frac{k_{2}}{k_{1}}\),则:
\]
考虑一点细节上的东西:
\]
考虑将\(f[next(i)] = af[i] + b\)带入原式会产生什么样的影响。
\]
设\(f[i]\)的系数为\(k_{1}\),常数项为\(k_{2}\).
\]
显然我们只需要将\(k_{1} -= Ga, k_{2} += Gb\)即可
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 55
#define ld double
int n, T;
int v[AC];
ld p, t1[AC][AC], t2[AC][AC];
inline int read()
{
int x = 0;char c = getchar();
while(c > '9' || c < '0') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x;
}
void pre()
{
T = read(), n = read();
for(R i = 1; i <= n; i ++) v[i] = read();
sort(v + 1, v + n + 1);
memset(t1, 0, sizeof(t1));
memset(t2, 0, sizeof(t2));
}
void dfs(int x, int lim)
{
if(x > T) return;
if(t1[x][lim] > 0 || t2[x][lim] > 0) return ;//记忆化?但这样的话就需要初始化了
//printf("%d %d\n", x, lim);
ld p1 = x ? p : 0;//在计算之前要修改概率
ld k1 = 1, k2 = 1, G = (1.0 - p1) * (1.0 / lim);
//printf("???%lf\n", G);
for(R i = 1; i <= lim; i ++)
{
int now = x + v[i];
if(now > T) continue;//如果不加这个判断的话,数组就要开100,,,因为now可以到100.。。
dfs(now, i);
k1 -= G * t1[now][i], k2 += G * t2[now][i];
}
t1[x][lim] = p / k1, t2[x][lim] = k2 / k1;
}
void work()
{
while(scanf("%lf", &p) != EOF)
{
pre(), dfs(0, n);
printf("%.3lf\n", t2[0][n]);
}
}
int main()
{
// freopen("in.in", "r", stdin);
work();
// fclose(stdin);
return 0;
}
[JLOI2012]时间流逝 树上高斯消元 概率期望的更多相关文章
- bzoj 2784 [JLOI2012]时间流逝——树上高斯消元
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2784 一个状态可以加很多个能量圈,但减少能量圈的情况只有一种.所以可以用树来刻画. 然后就变 ...
- LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt
题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- BZOJ3270 博物馆(高斯消元+概率期望)
将两个人各自所在点视为状态,新建一个图.到达某个终点的概率等于其期望次数.那么高斯消元即可. #include<iostream> #include<cstdio> #incl ...
- 洛谷P4457/loj#2513 [BJOI2018]治疗之雨(高斯消元+概率期望)
题面 传送门(loj) 传送门(洛谷) 题解 模拟赛的时候只想出了高斯消元然后死活不知道怎么继续--结果正解居然就是高斯消元卡常? 首先有个比较难受的地方是它一个回合可能不止扣一滴血--我们得算出\( ...
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- bzoj 2784 时间流逝 —— 树上高斯消元
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2784 其实转移是一棵树,从根到一个点表示一种能量圈状态,当能量值大于 T 是停止,也就是成为 ...
- 【JLOI 2012】时间流逝(期望,树上高斯消元)
题目链接 这是一道传统的期望题,可是有一些套路值得我去掌握. 我们用$s$来表示一种状态,就是当前拥有的能量圈,是一个正整数拆分的形式. 用$f_{s}$表示如果遇到果冻鱼后丢掉了最小的能量圈后的状态 ...
随机推荐
- 二分查找的C#实现
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 查找过程 首先,假设表中元素是按升序排列, ...
- ubuntu 16.04 安装php 5 6等版本
//加入ppa $ sudo add-apt-repository ppa:ondrej/php $ sudo apt-get update //安装5.6 $ sudo apt- //安装7 $ s ...
- [css 揭秘] :CSS揭秘 技巧(五):条纹背景
条纹背景 https://github.com/FannieGirl/ifannie/问题:条纹背景 在设觉设计中无处不在,我们真的可以用css 创建图案吗? 这一章相对还是比较复杂的哦!一起get. ...
- C#是数据类型
C#又开始了 开始数据类型 用的软件是VS2017 E short 短整型 int 中等整型 long 长整形 string 字符串类型 bool 布尔类型(true/flase) 相当于数 ...
- Configure,Makefile.am, Makefile.in, Makefile文件
一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...
- Linux命令之tar命令
[root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参数指令! - ...
- Kafka安装之二 在CentOS 7上安装Kafka
一.简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这 ...
- spark的运行方式——转载
本文转载自: spark的运行方式 本文主要讲述运行spark程序的几种方式,包括:本地测试.提交到集群运行.交互式运行 等. 在以下几种执行spark程序的方式中,都请注意master的设 ...
- 关于《数据结构》课本KMP算法的理解
数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...
- 使用docker国内镜像解决方案
1:蜂巢镜像 https://c.163yun.com/hub#/m/library/ 例如: docker pull hub.c.163.com/library/nginx:1.8 再次执行dock ...