期望题
(t1:)单位错选
这题期望等于概率,值等于(1)
(a_i=a_{i+1}),随机答案在(i+1)也随机,期望为(largefrac 1 {a_{i+1}})
(a_i>a_{i+1}),只有(frac{a_{i+1}}{a_i})概率在(1sim a_{i+1})中,期望为(largefrac{a_{i+1}}{a_i}×frac1{a_i+1}=frac1{a_i})
(a_i<a_{i+1}),随机的答案在(1sim a_i)中,(i+1)题正确答案有(frac{a_i}{a_{i+1}})概率,期望为(frac1{a_{i+1}})
综上,答案(largesumlimits_{i=1}^nfrac1{max(a_i,a_{i+1})})
(t2:)CF518D
也是假期望题,是个概率的
(f_{i,j})表示第(i)个人,时间为(j)秒的期望人数,考虑是否上电梯
上,由(f_{i-1,j-1})转移过来,概率为(p)
不上,由(f_{i,j-1})转移过来,概率(1-p)
转移方程(f_{i,j}=(1-p)×f_{i,j-1}+p×(f_{i-1,j-1}+1))
可以滚动数组
(ans:f_{n,t})
(t3:)
反着(dp),(f[i][j])表示考虑了(i)张红牌,(j)张黑牌的期望,(f[i][j]=frac i{i+j}×(f[i-1][j]+1)+frac j{i+j}×(f[i][j-1]-1))
因为要考虑到停止翻牌这种情况. 和0取max即可.这样每一个状态就都是合法的了.
注意使用滚动数组!最后答案不进位要特殊处理
f[now][m] *= 1000000;
f[now][m] = floor(f[now][m]);
printf("%.6lf
",f[now][m] / 1000000);
(t4:) POJ3071
(f_{i,j})表示第(i)轮比赛,(j)号获胜的概率,枚举对手
(f[i][j]+=f[i-1][j]*f[i-1][k]*p[j][k])
int n;
double p[N][N],f[10][N];
int main(){
while((~scanf("%d",&n)) && (~n)){
for(int i = 0;i < (1<<n);++i)
for(int j = 0;j < (1<<n);++j)
scanf("%lf",&p[i][j]);
memset(f,0,sizeof(f));
for(int i = 0;i < (1<<n);++i) f[0][i] = 1;
for(int i = 1;i <= n;++i)
for(int j = 0;j < (1<<n);++j)
for(int k = 0;k < (1<<n);++k)
if(((j >> (i-1))^1) == (k >> (i-1)))
f[i][j] += f[i-1][j]*f[i-1][k]*p[j][k];
double ans=0;
int idx = -1;
for(int i = 0;i < (1<<n);i++)
if(f[n][i] > ans){
ans = f[n][i];
idx = i+1;
}
printf("%d
",idx);
}
t5:聪聪与可可
(f_{x,y})表示聪当前在(x),可在(y),聪吃可的期望步数,(nxt[x][y])表示当前聪在(x),可在(y),聪下一步到哪
求(nxt[x][y]):求出(dis[x][y])表示从(x)到(y)的最短路,枚举找最小值
求(f[x][y])可以记忆化搜索,边界为当(x=y)时(f[x][y]=0=),当(x)下一步或两步能到(y)时,(f[x][y]=1)
代码不贴了