笔试题:旅游问题

在这里插入图片描述

'''
n个点,m边,无向 无环 无重边
第1行: n,m,k 总共停留k分钟
接下来n行:mi,v1i,v2i n个点:n个景点,第i个景点花费mi分钟,愉悦度分别增加v1i,v2i
接下来m行:xi,yi,ti 代表第i条边
初始愉悦度均为0
每游览完一个景点后,游游和小伙伴会 等概率随机选择一个可以从当前景点直达的 且来得及玩的景点作为下一个目的地
如果游览完一个景点后周围没有可以直达的且来得及游览的景点,游游和小伙伴就会提前结束游玩。
请分别计算出游游和小伙伴在游览结束后愉悦度的期望。
输入:
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
https://www.nowcoder.com/test/question/done?tid=32132700&qid=365969#summary
'''

n,m,k = list(map(int ,input().split(" ")))
# 用列表的Index快速获得
M = [0]
v1 = [0]
v2 = [0]
for _ in range(n):
    t,v,v_ = list(map(int, input().split(" ")))
    M.append(t)
    v1.append(v)
    v2.append(v_)
#存储边的关系
import collections
G = [collections.defaultdict(int) for _ in range(n+1)] #int id, t;
for _ in range(m):
    n1, n2, t = list(map(int, input().split(" ")))
    G[n1][n2] = t
    G[n2][n1] = t

#dp[i][j] 从i景点出发,还剩下j分钟可以用时候,可以获得的期望happy(期望可以理解为平均值
dp1 = [[0 for _ in range(k+1)] for _ in range(n+1)]
dp2 = [[0 for _ in range(k+1)] for _ in range(n+1)]
#后更新时间
for j in range(1,k+1):
    #先更新结点
    for i in range(1,n+1):
        happy1 = 0
        happy2 = 0
        cnt = 0
        if j>=M[i]:
            dp1[i][j] += v1[i]
            dp2[i][j] += v2[i]
        for id,time in G[i].items():
            if j>=M[i]+time+M[id]:
                happy1 += dp1[id][j-time - M[i]]
                happy2 += dp2[id][j - time - M[i]]
                cnt+=1
        if happy1:
            dp1[i][j] += happy1/cnt
            dp2[i][j] += happy2 / cnt

ans1,ans2 = 0,0
for i in range(1,n+1): #假设所有的初始景点,都时间够玩
    if not dp1[i][k]:
        n-=1
        continue
    ans1 += dp1[i][k]
    ans2 += dp2[i][k]
print('%.5f %.5f'% (ans1/n, ans2/n))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值