【BZOJ2134】单选错位 概率DP】的更多相关文章

一句话:有一些看似有关系的期望在把事件全面发生之后就变得相互独立了 #include<cstdio> using namespace std; ]; double ans; int main() { scanf(); ;i<=n;i++)a[i]=((]*A+B)%; ;i<=n;i++)a[i]=a[i]%C+; ]==||a[n]==)) { ]>=a[n])ans+=]; else ans+=1.0/a[n]; } ;i<=n;i++) { ||a[i-]==)c…
BZOJ_2134_单选错位——期望DP 题意: 分析:设A为Ai ∈ [1,ai+1] 的概率,B为Ai = A(imodn+1)的概率显然P(A|B) = 1,那么根据贝叶斯定理P(B) = P(B|A)*P(A)P(A) = min(ai,ai+1)/aiP(B|A) = 1/a(i+1)P(B) = min(ai,ai+1)/(ai*a(i+1))又因为期望的可加性,直接加起来统计答案 代码: #include <stdio.h> #include <string.h> #…
bzoj2134单选错位 题意: 试卷上n道选择题,每道分别有ai个选项.某人全做对了,但第i道题的答案写在了第i+1道题的位置,第n道题答案写在第1题的位置.求期望能对几道.n≤10000000 题解: 水题,然而我不会.第i题与第i+1题答案一样的概率是1/max(aiai+1) 代码: #include <cstdio> #include <algorithm> using namespace std; int a[],n,A,B,C; int main(){ scanf(&…
题目链接 如题目中的公式,我们只要把做对每个题的概率加起来就可以了(乘个1就是期望). 做对第i道题的概率 \[P_i=\frac{1}{max(a_{i-1},a_i)}\] 原式是 \(P_i=\frac{min(a_{i-1},a_i)}{a_{i-1}\times a_i}\),化简后得到上式. 例:假设第i-1道有3个选项,第i道有5个选项,暴力一点,那么做对就是从3个中选1个和从5个中选1个相同的概率, 概率为 \(\frac{1}{3}\times\frac{1}{5}+\frac…
[题意]有n道题,第i道题有ai个选项.把第i道题的正确答案填到第i+1道题上(n填到1),问期望做对几道题.n<=10^7. [算法]期望DP [题解]正确答案的随机分布不受某道题填到后面是否正确影响,因此每道题对的期望都是独立的. 从排列的角度分析,对每道题有a[i-1]个选择和a[i]个选项,共a[i-1]*a[i]种排列,其中只有min(a[i-1],ai)种排列使这道题正确,所以 $$E(i)=\frac{Min(a[i-1],a[i])}{a[i-1]*a[i]}=\frac{1}{…
发现概率是∑1/两道题答案相同的概率, 稍加化简 #include <map> #include <ctime> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k)…
Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1101  Solved: 851[Submit][Status][Discuss] Description Input n很大,为了避免读入耗时太多, 输入文件只有5个整数参数n, A, B, C, a1, 由上交的程序产生数列a. 下面给出pascal/C/C++的读入语句和产生序列的语句(默认从标准输入读入):  // for pascal  readln(n,A,B,C,q[1]);  for…
题目链接 题解: 单独考虑每一道题目对答案的贡献. 设$g_i$表示gx在第$i$道题目的答案是否正确(1表示正确,0表示不正确),则$P(g_i=1)$表示gx在第$i$道题目的答案正确的概率. 我们要求的就是$\sum_{i=1}^{n} P(g_i=1)\times 1$. 那么我们该如何求解$P(g_i=1)$呢? 首先,结合题目可以得出以下结论: 设$s_i$为第i道题目的正确答案. 若$g_i=1$,则有$s_i=s_{i-1}$.特别地,若$g_1=1$,则有$s_n=s_1$.…
1.题意:这就是说考试的时候抄串了一位能对几个(雾) 2.分析:这是一个期望问题,期望就是平均,E(a+b)=E(a)+E(b),所以我们直接算出每个点能对几个就好,那么就是1/max(a[i],a[i%n+1])就好,最后加起来 #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define LL long l…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2134 题解:因为每个答案之间是互不影响的,所以我们可以挨个计算. 假设当前在做 i 题目,如果a[i+1]>=a[i],那么我们只需要让i+1题目的答案是i的答案即可,ans+=1/a[i+1] 否则 i 题目的答案必须在1--a[i+1],所以ans+=a[i+1]/a[i]*1/a[i+1]=1/a[i] 换句话说 ans+=min(1/a[i+1],1/a[i]) 代码: #inclu…