OR159. 游游的旅行
描述
游游和小伙伴结伴而行,途径一处园林,游游与小伙伴决定进去游览。该园林可以看作一张个点(每个点代表一个景点)
条边的无向图(无重边,无自环)。旅途中,两人的初始愉悦度皆为0 ,第 i个景点需要耗费
分钟的时间,会让游游和小伙伴的愉悦度分别增加
,
。每条边代表一条路径,第 i 条边连接编号为
,
的两个景点,从
走到
或者从
走到
耗费的时间都是
分钟。游游和小伙伴预计在该园林停留
分钟。检票进入园林后,游游和小伙伴会等概率的随机选择一个景点开始游览,每游览完一个景点后,游游和小伙伴会等概率的随机选择一个可以从当前景点直达的且来得及玩的景点作为下一个目的地。如果游览完一个景点后周围没有可以直达的且来得及游览的景点,游游和小伙伴就会提前结束游玩。 请分别计算出游游和小伙伴在游览结束后愉悦度的期望。
输入描述
第一行三个整数,分别表示输出描述
输出一行实数,分别表示游游和小伙伴度的期望,精确到小数点后 5位,以空格隔开。示例1
输入:
5 4 60 25 12 83 30 38 90 16 13 70 22 15 63 50 72 18 2 1 7 3 1 7 4 3 1 5 3 10
输出:
39.20000 114.40000
C++ 解法, 执行用时: 9ms, 内存消耗: 776KB, 提交时间: 2020-09-08
#include <bits/stdc++.h> using namespace std; const int N = 101; struct P{ int id, t; }; int n,m,k; vector<P> G[N]; vector<int> M(N), v1(N), v2(N); double F(vector<int> v){ double dp[n+1][k+1]; memset(dp, 0, sizeof(dp)); for(int j=1;j<=k;j++) for(int i=1;i<=n;i++){ double s = 0; int cnt = 0; if(j>=M[i]) dp[i][j] += v[i]; for(int u=0;u<G[i].size();u++) if(j>=G[i][u].t + M[i] + M[G[i][u].id]){ s += dp[G[i][u].id][j-G[i][u].t-M[i]]; cnt++; } if(s) dp[i][j] += s/cnt; } double r = 0; for(int i=1;i<=n;i++) r += dp[i][k]; return r / n; } int main(){ cin>>n>>m>>k; for(int i=1;i<=n;i++){ cin>>M[i]>>v1[i]>>v2[i]; } int x,y,t; for(int i=0;i<m;i++){ cin>>x>>y>>t; G[x].push_back({y, t}); G[y].push_back({x, t}); } printf("%.5f %.5f\n", F(v1), F(v2)); return 0; }
C++ 解法, 执行用时: 9ms, 内存消耗: 784KB, 提交时间: 2020-08-11
#include <iostream> #include <algorithm> #include <bits/stdc++.h> using namespace std; const int N=101; struct P { int id,t; }; vector<P> G[N]; vector<int> M(N), v1(N),v2(N); int n,m,k; double F(vector<int> v) { double dp[n+1][k+1]; memset(dp,0,sizeof(dp)); for(int j=1;j<=k;j++) { for(int i=1;i<=n;i++) { double s=0; int cnt=0; if(j>=M[i]) dp[i][j]+=v[i]; for(int u=0;u<G[i].size();u++) { if(j>=G[i][u].t+M[i]+M[G[i][u].id]) { s+=dp[G[i][u].id][j-G[i][u].t-M[i]]; cnt++; } } if(s) dp[i][j]+=s/cnt; } } double r=0; for(int i=1;i<=n;i++) { r+=dp[i][k]; } return r/n; } int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) { cin>>M[i]>>v1[i]>>v2[i]; } int x,y,t; for(int i=0;i<m;i++) { cin>>x>>y>>t; G[x].push_back({y,t}); G[y].push_back({x,t}); } printf("%.5f %.5f\n", F(v1), F(v2)); return 0; }