2022-01-21 每日打卡:难题精刷

2022-01-21 每日打卡:难题精刷

写在前面

“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,所刷题目共三个来源:之前没做出来的 ;Leetcode中等,困难难度题目; 周赛题目;某个专题的经典题目,所有代码已AC。每日1-3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。

单源最短路

在这里插入图片描述

  • Dijkstra算法:
import heapq

n, m, s, t = list(map(int, input().split()))
# 注意下标,n个点的下标为 1~n
e = [[]for i in range(n+1)]
dis = [10000000000 for i in range(n+1)]
for i in range(m):
	u, v, w = list(map(int, input().split()))
    # 不要通过循环一遍遍的检查是否该加入队列,会超时
    # 加一遍就是有向边,加两边就是无向边
	e[u].append([v, w])
	e[v].append([u, w])

dis[s] = 0
q = []
# 使用最小堆,默认会按照第一个排序
heapq.heappush(q, [0, s])
while q:
    d, u = heapq.heappop(q)
    # 说明前面已经有更近的u更新过了
    # 且一定加入了堆中
    if d > dis[u]:
        continue
    
    # 更新所有可达路线,而不是选定的路线
    for v, w in e[u]:
        if dis[u]+w < dis[v]:
            dis[v] = dis[u]+w
            # 每次是从「未求出最短路径的点」中 取出 
            # 距离起点!!! 
            # 最近的点
            heapq.heappush(q, [dis[v], v])


print(dis[t])

最小生成树

在这里插入图片描述

  • Kruskal:
import heapq


def find(u):
    if parent[u] != u:
        parent[u] = find(parent[u])
    return parent[u]

# 把u并入v的集合


def union(u, v):
    # 这个写法是不可以的,比如(1,5)(1,6)(5,6)
    # 变成(5,5)(6,6),此时5和6仍不在一个集合
    # parent[u] = find(v)
    # 需要像下面这种,套娃写法!
    # 目的是修改**根**
    parent[find(u)] = find(v)


n, m = list(map(int, input().split()))
# 注意下标,n个点的下标为 1~n
q = []
parent, ans = [_ for _ in range(n+1)], 0
for i in range(m):
    u, v, w = list(map(int, input().split()))
    q.append([w, u, v])

# q.sort(key = lambda x:x[0])
heapq.heapify(q)

# 注意结束条件,n个点的生成树为n-1条边
cnt = 0
while cnt< n-1:
# while q:
    # w,u,v = q.pop(0)
    w, u, v = heapq.heappop(q)
    if find(u) != find(v):
        union(u, v)
        ans += w
        cnt+=1
print(ans)

  • Prim:
import heapq

n, m = [ int(a) for a in input().split()]
# 注意下标,n个点的下标为 1~n
e = [[]for i in range(n+1)]
for i in range(m):
	u, v, w = [ int(a) for a in input().split()]
    # 不要通过循环一遍遍的检查是否该加入队列,会超时
    # 加一遍就是有向边,加两边就是无向边
	e[u].append([w, v])
	e[v].append([w, u])

q, tmp = e[1], 1
used, ans = set([1]), 0
heapq.heapify(q)
while len(used) != n:
    w, v = heapq.heappop(q)
    if v not in used:
        used.add(v)
        ans += w
        for i in e[v]:
            heapq.heappush(q, i)
print(ans)

要找出某个日期的正确上下班打卡时间,你可以使用`datetime`模块进行日期时间的比较和筛选。下面是一个示例代码: ```python import datetime # 打卡数据 data = [ {'日期': '2023-06-10', '开始时间': '2023-06-10 16:27:00', '结束时间': '2023-06-10 17:39:00'}, {'日期': '2023-06-11', '开始时间': '2023-06-11 01:57:00', '结束时间': '2023-06-11 02:02:00'}, {'日期': '2023-06-11', '开始时间': '2023-06-11 15:57:00', '结束时间': '2023-06-12 01:51:00'}, {'日期': '2023-07-01', '开始时间': '2023-07-01 08:09:00', '结束时间': '2023-07-01 17:25:00'}, {'日期': '2023-07-01', '开始时间': '2023-07-01 17:32:00', '结束时间': '2023-07-01 17:41:00'} ] target_date = datetime.date(2023, 6, 11) # 指定目标日期 # 遍历打卡数据,找到目标日期的打卡记录 for record in data: record_date = datetime.datetime.strptime(record['日期'], '%Y-%m-%d').date() if record_date == target_date: start_time = datetime.datetime.strptime(record['开始时间'], '%Y-%m-%d %H:%M:%S') end_time = datetime.datetime.strptime(record['结束时间'], '%Y-%m-%d %H:%M:%S') print('开始时间:', start_time) print('结束时间:', end_time) ``` 在上面的示例代码中,我们首先指定目标日期为`2023-06-11`,然后遍历打卡数据,找到与目标日期匹配的记录。然后将开始时间和结束时间转换为`datetime`对象,并打印出来。 你可以根据实际需要修改目标日期和打卡数据,以适应你的情况。 希望对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值