5.24考试总结
作者:互联网
带着爆0的心态考的试,没想到整了个假rk2 (炸鱼大佬wtz忒强了OTZ
T1 景区路线规划
这题对刚学完概率期望的我来说简直水爆了好吗。。
因为存在时间限制,不好跑高斯消元,就直接跑dp就完了。
令i为当前所在景点,j为已过时间,
f[i][j]=∑f[u][j-t[k]-c[i]]/out,(u与i联通,k为u,i,之间边的编号)
因为每次在合法的景点中做选择,所以out并不是u的出度,而是u可选的合法景点,每次要遍历一遍求得。
code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,k,st[20001],to[20001],nex[20001],head[101],c[101],t[20001],h1[101],h2[101]; 4 double f1[101][481],f2[101][481],ans1,ans2; 5 inline void add(int a,int b,int e,int d) 6 { 7 st[d]=a; to[d]=b; nex[d]=head[a]; head[a]=d; t[d]=e; 8 st[d+m]=b; to[d+m]=a; nex[d+m]=head[b]; head[b]=d+m; t[d+m]=e; 9 } 10 inline double dfs1(int loc,int tim) 11 { 12 if(f1[loc][tim]) return f1[loc][tim]; 13 int out=0; 14 for(int i=head[loc];i;i=nex[i]) 15 { 16 int v=to[i]; 17 if(tim+t[i]+c[v]<=k) out++; 18 } 19 f1[loc][tim]=h1[loc]; 20 if(!out) return f1[loc][tim]; 21 for(int i=head[loc];i;i=nex[i]) 22 { 23 int v=to[i]; 24 if(tim+t[i]+c[v]<=k) 25 f1[loc][tim]+=dfs1(v,tim+t[i]+c[v])/out; 26 } 27 return f1[loc][tim]; 28 } 29 inline double dfs2(int loc,int tim) 30 { 31 if(f2[loc][tim]) return f2[loc][tim]; 32 int out=0; 33 for(int i=head[loc];i;i=nex[i]) 34 { 35 int v=to[i]; 36 if(tim+t[i]+c[v]<=k) out++; 37 } 38 f2[loc][tim]=h2[loc]; 39 if(!out) return f2[loc][tim]; 40 for(int i=head[loc];i;i=nex[i]) 41 { 42 int v=to[i]; 43 if(tim+t[i]+c[v]<=k) 44 f2[loc][tim]+=dfs2(v,tim+t[i]+c[v])/out; 45 } 46 return f2[loc][tim]; 47 } 48 int main() 49 { 50 scanf("%d%d%d",&n,&m,&k); 51 for(int i=1;i<=n;i++) 52 scanf("%d%d%d",&c[i],&h1[i],&h2[i]); 53 for(int i=1;i<=m;i++) 54 { 55 int x,y,z; 56 scanf("%d%d%d",&x,&y,&z); 57 add(x,y,z,i); 58 } 59 for(int i=1;i<=n;i++) 60 { 61 ans1+=dfs1(i,c[i]); 62 ans2+=dfs2(i,c[i]); 63 } 64 ans1/=n; ans2/=n; 65 printf("%.5lf %.5lf",ans1,ans2); 66 return 0; 67 }T1
标签:总结,loc,head,nex,int,5.24,20001,101,考试 来源: https://www.cnblogs.com/keeeeeeen/p/14812891.html