Lightoj 1408 Batting Practice LightOJ - 1408(解方程....)
发布日期:2021-06-30 10:23:25 浏览次数:2 分类:技术文章

本文共 1714 字,大约阅读时间需要 5 分钟。

题意

p p p概率投偏球,问连续中 k ! k_! k!次和连续不中 k 2 k_2 k2次的期望击球数


定义 f [ i ] f[i] f[i]为连续打偏 i i i次,还需要的期望

定义 g [ i ] g[i] g[i]为连续打中 i i i次,还需要的期望

f [ k 2 ] = g [ k 1 ] = 0 f[k_2]=g[k_1]=0 f[k2]=g[k1]=0

f [ i ] = f [ i + 1 ] ∗ p + g [ 1 ] ∗ ( 1 − p ) + 1 f[i]=f[i+1]*p+g[1]*(1-p)+1 f[i]=f[i+1]p+g[1](1p)+1

可以发现 f [ i ] f[i] f[i]的转移依赖于 g [ 1 ] g[1] g[1]

g [ i ] g[i] g[i]的转移依赖于 f [ 1 ] f[1] f[1]

所以可以令 f [ i ] = x i i ∗ g [ 1 ] + c s i f[i]=xi_i*g[1]+cs_i f[i]=xiig[1]+csi

其中 x i i xi_i xii g [ 1 ] g[1] g[1]的系数, c s i cs_i csi是常数项展开递推

对数组 g g g也如此,最后就可以解二元一次方程

但是我们可以O(1)求而不需要递推

x = g [ 1 ] ∗ ( 1 − p ) + 1 x=g[1]*(1-p)+1 x=g[1](1p)+1

那么 f [ 1 ] = x + x ∗ p 1 + x ∗ p 2 . . . + x ∗ p k 2 − 1 f[1]=x+x*p^1+x*p^2...+x*p^{k_2-1} f[1]=x+xp1+xp2...+xpk21

等比数列求和

f [ 1 ] = ( g [ 1 ] ∗ ( 1 − p ) + 1 ) ∗ ( 1 − p k 2 − 1 ) 1 − p f[1]=\frac{(g[1]*(1-p)+1)*(1-p^{k_2-1})}{1-p} f[1]=1p(g[1](1p)+1)(1pk21)

同理

g [ 1 ] = ( f [ 1 ] ∗ p + 1 ) ∗ ( 1 − ( 1 − p ) k 1 − 1 ) p g[1]=\frac{(f[1]*p+1)*(1-(1-p)^{k_1-1})}{p} g[1]=p(f[1]p+1)(1(1p)k11)

然后,我就感觉我的解方程白学了…

#include 
using namespace std;const int maxn = 2e5+10;double xi[maxn],cs[maxn];double x[maxn],s[maxn],p;int main(){
int n,t,casenum=0,k1,k2; cin >> t; while( t-- ) {
cin >> p >> k1 >> k2; //p概率出局 xi[k2]=cs[k2]=x[k1]=s[k1]=0; for(int i=k2-1;i>=1;i--)//出局 {
xi[i] = xi[i+1]*p+(1.0-p); cs[i] = cs[i+1]*p+1.0; } //f[1]=xi[1]*g[1]+cs[1] for(int i=k1-1;i>=1;i--)//不出局 {
x[i]=x[i+1]*(1-p)+p; s[i]=s[i+1]*(1-p)+1.0; } //g[1]=x[1]*f[1]+s[1] cs[1]+=xi[1]*s[1]; xi[1]*=x[1]; xi[1]-=1.0; double f1=0; if( xi[1]!=0 ) f1=-(cs[1]/xi[1]); double g1 = x[1]*f1+s[1]; printf("Case %d: %.3lf\n",++casenum,f1*p+g1*(1.0-p)+1); }}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/109378195 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:次小生成树算法(严格LCA)
下一篇:SPOJ 839 Optimal Marks(经典二进制最小割)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月09日 16时08分29秒