NC 13250. 景区路线规划

链接

https://ac.nowcoder.com/acm/problem/13250

题意

对于一个景区道路网,求出游客的满意度的期望值。基于用户的喜好差异,需要对男性游客和女性游客的满意度分别计算。

景区被描述成一张 $n$ 个点、$m$ 条边的无向图(无重边,无自环)。每个点代表一个景点,第 $i$ 个景点游览需要耗费$c_i$ 分钟,会让男性游客和女性游客的满意度分别增加 $h1$ 和 $h2$(满意度初始值都为 $0$)。每条边代表一条路,第 $i$ 条边连接编号为 $x_i,y_i$ 的两个景点,从景点 $x_i$ 走到 $y_i$和从 $y_i$走到$x_i$ 的时间都是 $t_i$ 分钟

每个游客在景区中最长可以游览 $k$ 分钟,最开始会随机的通过不同大门进入到一个景点开始游览,每游览完一个项目,游客会等概率随机选择一个可以从当前景点直达且来得及游览的景点作为下一个游览目标(已经游览过的景点也会被作为目标)。如果游览完一个景点后,周围没有来得及游览的景点,本次游玩就结束了

分别计算男性和女性在游玩结束后开心度的期望。

思路

期望 DP,记忆化搜索

设 $f[0/1][i][j]$ 为男性/女性到达景点 $i$ 还剩 $j$ 分钟的期望值

$f[0/1][i][j]=(\sum \limits_{j-c[i]>=dist[i][k]+c[k]}f[0/1][k][j-dist[i][k]])/cnt$

代码

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
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
typedef pair<int,int> pii;
const int N=110;
int c[N];
double h[2][N];
double f[2][N][5*N];
vector<pii> g[N];
double dfs(int u,int t,int gender) {
if(f[gender][u][t]) return f[gender][u][t];
double res=0;
int cnt=0;
for(auto x:g[u]) {
int v=x.fi,w=x.se;
if(w+c[v]>t-c[u]) continue;
cnt++;
res+=dfs(v,t-c[u]-w,gender);
}
if(cnt) res/=cnt;
return f[gender][u][t]=res+h[gender][u];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>c[i]>>h[0][i]>>h[1][i];
for(int i=1;i<=m;i++) {
int u,v,w;
cin>>u>>v>>w;
g[u].pb({v,w});
g[v].pb({u,w});
}
double ans1=0,ans2=0;
for(int i=1;i<=n;i++)
if(c[i]<=k) {
ans1+=dfs(i,k,0);
ans2+=dfs(i,k,1);
}
cout<<fixed<<setprecision(5)<<ans1/n<<" "<<ans2/n<<endl;
return 0;
}