7-6 你能上学了吗? (10分)

n = int(input())
cnt = 0
for i in range(n):
    l = input()
    if int(l[6:14]) <= 20140831:
        print('YES')
        cnt += 1
    else:
        print('NO')
print('Pass: {}; Fail: {}'.format(n - cnt, cnt))

 

为了求出学生上学时走的总路程最短的村子,我们可以采用Dijkstra算法或Floyd算法来计算各村子之间的最短路径,并将各个村子到其他村子的距离进行累加,最后比较哪个村子的累加值最小即可。 下面以Dijkstra算法为例,步骤如下: 1. 创建一个空的集合S,用于存放已经找到最短路径的点; 2. 创建一个长度为7的数组dist,用于存放起点到各个点的最短路径长度,初始值为INF(表示无穷大); 3. 将起点加入集合S中,更新与起点相邻的点的最短路径长度,将这些点加入一个优先队列中; 4. 从优先队列中选取一个距离起点最近的点,并将其加入集合S中; 5. 更新与该点相邻的点的最短路径长度,如果有更新,则将这些点加入优先队列中; 6. 重复步骤4和5直到优先队列为空,即所有点的最短路径长度都已经确定。 根据Dijkstra算法,我们可以得出每个村子到其他村子的最短路径长度,如下表所示: | | A | B | C | D | E | F | G | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | A | 0 | 15 | 10 | 20 | INF | INF | INF | | B | 15 | 0 | 5 | 10 | 20 | INF | INF | | C | 10 | 5 | 0 | 15 | 30 | 20 | INF | | D | 20 | 10 | 15 | 0 | 10 | 25 | 20 | | E | INF | 20 | 30 | 10 | 0 | 10 | INF | | F | INF | INF | 20 | 25 | 10 | 0 | 15 | | G | INF | INF | INF | 20 | INF | 15 | 0 | 然后再将每个村子到其他村子的距离乘以该村子的小学生人数,再将这些值累加起来,最后比较哪个村子的累加值最小即可。计算结果如下: | | A | B | C | D | E | F | G | | --- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | | A | 0 | 225 | 100 | 300 | INF | INF | INF | | B | 225 | 0 | 125 | 200 | 400 | INF | INF | | C | 100 | 125 | 0 | 300 | 780 | 400 | INF | | D | 300 | 200 | 225 | 0 | 200 | 625 | 400 | | E | INF | 800 | 1200 | 400 | 0 | 200 | INF | | F | INF | INF | 800 | 1250 | 400 | 0 | 525 | | G | INF | INF | INF | 400 | INF | 525 | 0 | 由上表可得,学校应该建在村子C,学生上学时走的总路程最短。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值