【HDU】4089 Activation
http://acm.hdu.edu.cn/showproblem.php?pid=4089
题意:
有n个人排队等着在官网上激活游戏。主角排在第m个。
对于队列中的第一个人。有以下情况:
1、激活失败,留在队列中等待下一次激活(概率为p1)
2、失去连接,出队列,然后排在队列的最后(概率为p2)
3、激活成功,离开队列(概率为p3)
4、服务器瘫痪,服务器停止激活,所有人都无法激活了。
求服务器瘫痪时主角在队列中的位置<=k的概率
n, m<=1000, p1+p2+p3+p4=1
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=10005;
const double eps=1e-10;
double c[N], T1[N], T2[N], p[5], T;
int n, m, K;
double abs(double x) { return x<0?-x:x; }
int main() {
while(~scanf("%d%d%d", &n, &m, &K)) {
for(int i=1; i<=4; ++i) scanf("%lf", &p[i]);
if(abs(p[4])<eps) { puts("0.00000"); continue; }
double *now=T1, *last=T2, di=1-p[1];
T=p[2]/di;
for(int i=1; i<=n; ++i) {
c[1]=p[4]/di;
for(int j=2, g=min(K, i); j<=g; ++j) c[j]=(last[j-1]*p[3]+p[4])/di;
for(int j=K+1; j<=i; ++j) c[j]=last[j-1]*p[3]/di;
double up=0, down=1;
for(int j=1; j<=i; ++j) down*=T, up*=T, up+=c[j];
now[i]=up/(1-down);
now[1]=T*now[i]+c[1];
for(int j=2; j<=i; ++j) now[j]=T*now[j-1]+c[j];
swap(now, last);
}
printf("%.5f\n", last[m]);
memset(T2, 0, sizeof(double)*(n+1));
}
return 0;
}
做完这题深深感到了数学题与编程题不同= =...
首先容易设计出$d[i][j]$表示一共还有i个人,主角排在了$j$位(反正一开始我没考虑到人总数对方程的影响妈呀QAQ果然还是太弱么...
容易得到:
$$
\begin{align}
d[i][1] & = d[i][1]p1 + d[i][i]p2 + p4 & j==1时 \\
d[i][j] & = d[i][j]p1 + d[i][j-1]p2 + d[i-1][j-1]p3 + p4 & j<=k时 \\
d[i][j] & = (d[i][j-1]p2 + d[i-1][j-1]p3)/(1-p1) & k<j时
\end{align}
$$
深度化简可以得到:
$$
\begin{align}
d[i][1] & = Td[i][i] + c[1] & j==1时\\
d[i][j] & = Td[i][j-1] + c[j] & j<=k时\\
d[i][j] & = Td[i][j-1] + c[j] & k<j时
\end{align}
$$
其中$T=p2/(1-p1)$, $c[j]$为那些常数项(因为$d[i-1]$的部分已经求出来了,现在只是考虑互相关系的$d[i]$,所以把$d[i-1]$看成常数)
那么这成了递归定义,发现我没只需要求出$d[i][i]$就行了...
一直递归下去可以发现,$d[i][i]=T(T(T(...Td[i][i]+c[1])+c[2])+c[3])+...+c[i]$
所以$d[i][i]=C/(1-T^i), C=T(T...T0+c[1])+c[2]+...+c[i]$
最后还要特判$p4=0$的情况啊,显然答案是0啊..(可是我发现我的程序对p4=0的情况已经免疫了啊?为啥还会waQAQ不明觉厉..反正特判一下就能对QAQ)
【HDU】4089 Activation的更多相关文章
- 【HDOJ】4089 Activation
1. 题目描述长度为n的等待队列,tomato处于第m个,有如下四种可能:(1)激活失败,概率为$p_1$,队列中的顺序不变:(2)连接失败,概率为$p_2$,队头玩家重新排在队尾:(3)激活成功,概 ...
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- 【HDU】2191 多重背包问题
原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...
- 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交
[题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...
- 【HDU】6148 Valley Numer 数位DP
[算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...
- 【HDU】5269 ZYB loves Xor I
[算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...
- 【HDU】3068 最长回文
[算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...
- 【HDU】2222 Keywords Search
[算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...
- 【HDU】6012 Lotus and Horticulture (BC#91 T2)
[算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...
随机推荐
- Pyqt QSystemTrayIcon 实现托盘效果
pyqt的托盘效果很好实现,在Pyqt的demo中有个例子 路径:PyQt4\examples\desktop\systray.py 今天我就仿这个Tray效果做效果 一. 创建UI trayicon ...
- Qt Designer 修改窗体大小改变控件位置
一.新建一个窗体 用qt designer 新建一个QWidget窗体, 在窗体中右键 选择布局, 发现布局是选择不了的,这个是因为窗体里面没有添加控件, 任意添加空间后便可选择 右键-- 布局-- ...
- 【转载】 python修饰符@
@符号在python语言中具有特殊含义,用来作为修饰符使用, @修饰符有点像函数指针,python解释器发现执行的时候如果碰到@修饰的函数,首先就解析它,找到它对应的函数进行调用,并且会把@修饰下面一 ...
- [LeetCode] Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- <转>删除文件夹下所有的.svn文件
当使用了svn版本控制系统后每个目录下都会有一个.svn目录存在,开发完当交付产品或者上传到服务器时一般要把这些目录删除,这里总结了一下在linux和win下的办法. 一.在linux下 删除这些目录 ...
- hdu 4046 2011北京赛区网络赛G 线段树 ***
还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w #include<cstdio> #include<cstring> #defi ...
- Linux系统安装及初始化(ubuntu14.04)
Windows 7下硬盘安装Ubuntu 14.04图文教程 Ubuntu 官方已经发布了正式版的 Ubuntu 14.04 LTS,并宣称这是为云计算准备的版本.该版本在云平台和伸缩环境的可靠性.性 ...
- java thread run and start
在java中继承Thread,线程启动有两中方法:start()和run().下面简单介绍一下两者的区别. start():启动一个线程,此时线程处于就绪状态,然后调用Thread对象的run()方法 ...
- Codeforces Round #130 (Div. 2) C. Police Station
题目链接:http://codeforces.com/contest/208/problem/C 思路:题目要求的是经过1~N的最短路上的某个点的路径数 / 最短路的条数的最大值.一开始我是用spf ...
- filter应用案例一:分IP统计访问次数
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了.用Map<String,Integer>装载统计的数据.Map创建时间(使用ServletContextListener, ...