「CF498B」Name That Tune
题解
概率好难,都不会做啊
d[i][j]表示前i-1秒辨认了j首的概率
f[i][j+1]+=f[i][j]*(1-p[i])
f[i+1][j+1]+=f[i][j]*p[i]
如果没有什么几秒后辨识之类的就是这样结束了吧。。。
加上这个设定之后
f[i][j]转移到f[i][j+t[i]]的部分就不对了。。。
即f[i][j]原来有(1-p[i])^t[i]的概率转移到f[i][j+t[i]]
现在要把这部分改到f[i+1][j+t[i]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include<cstdio> #include<cmath> #include<ctime> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<set> #define ll long long #define mod 1000000007 #define inf 1000000000 using namespace std; int read() { int f=1,x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m; double ans,p1; double f[5005][5005]; double p[5005],tmp[5005]; int t[5005]; int main() { n=read();m=read(); for(int i=1;i<=n;i++) p[i]=read()/100.0,t[i]=read(); f[1][0]=1;p[n+1]=0;t[n+1]=5000; for(int i=1;i<=n+1;i++) { p1=pow(1-p[i],t[i]); for(int j=0;j<=m;j++)tmp[j]=f[i][j]; for(int j=0;j<=m;j++) { f[i][j+1]+=f[i][j]*(1-p[i]); f[i+1][j+1]+=f[i][j]*p[i]; if(j+t[i]<=m) { f[i][j+t[i]]-=tmp[j]*p1; f[i+1][j+t[i]]+=tmp[j]*p1; } } } for(int i=1;i<=n+1;i++)ans+=f[i][m]*(i-1); printf("%.10lf",ans); } |
神死了……样例死活看不懂