2024.7.10刷题记录

目录

一、1001-[NOIP2007]字符串的展开

二、1003-[NOIP2010]机器翻译

三、853. 有边数限制的最短路 - AcWing题库

bellman_ford算法

四、851. spfa求最短路 - AcWing题库

spfa算法


一、1001-[NOIP2007]字符串的展开

p1, p2, p3 = map(int, input().split())
st = input()
n = len(st)
s = ''

for i, c in enumerate(st):
    if c == '-' and 1 <= i < n - 1:
        a, b = st[i - 1], st[i + 1]
        if a >= b or not ((a.isalpha() and b.isalpha()) or (a.isdigit() and b.isdigit())):
            z = '-'
        elif p1 == 3:
            z = '*' * (ord(b) - ord(a) - 1) * p2
        else:
            z = ''
            for i in range(ord(a) + 1, ord(b)):
                z += chr(i) * p2
            if p3 == 2: z = z[::-1]
            z = z.upper() if p1 == 2 else z.lower()
        s += z
    else:
        s += c
print(s)

二、1003-[NOIP2010]机器翻译

from collections import deque

R = lambda: map(int, input().split())
m, n = R()
nums = list(R())

q = deque()    # 队列
len_q = 0    # 队列长度
N = 1010
st = [False for _ in range(N)]    # 标记是否放入内存

ans = 0
for x in nums:
    if not st[x]:
        # 没在内存
        if len_q == m:
            # 内存超限制,移出内存
            a = q.popleft()
            st[a] = False
            len_q -= 1
        # 将外存单词放入内存
        st[x] = True
        q.append(x)
        len_q += 1
        ans += 1    # 查词次数加一
print(ans)

三、853. 有边数限制的最短路 - AcWing题库

bellman_ford算法

g = []
N = 510
dist = [float('inf') for _ in range(N)]

R = lambda: map(int, input().split())
n, m, k = R()
for _ in range(m):
    g.append(list(R()))
    
def bellman_ford():
    dist[1] = 0
    for i in range(k):
        backup = dist.copy()
        for j in range(m):
            a, b, w = g[j]
            dist[b] = min(dist[b], backup[a] + w)
        if backup == dist:
            # 无法再更新了
            break
    return dist[n]
    
t = bellman_ford()
print("impossible" if t > int(5e6) + 100 else t)

四、851. spfa求最短路 - AcWing题库

spfa算法

from collections import deque
# 稀疏图用邻接表
N = int(1e5) + 10
# 头节点初始化为-1、值为最大值
h = [-1] * N; e = [0] * N; ne = [0] * N; val = [0] * N; idx = 0
st = [False] * N
inf = float('inf')
dist = [inf for _ in range(N)]     # 初始化成无穷大
q = deque()

def add(x, y, z):
    global idx
    e[idx] = y
    val[idx] = z
    ne[idx] = h[x]
    h[x] = idx
    idx += 1

R = lambda: map(int, input().split())
n, m = R()
for _ in range(m):
    x, y, z = R()
    add(x, y, z)
  
def spfa():
    dist[1] = 0
    # st[1] = True
    q.append(1)
    while q:
        t = q.popleft()
        st[t] = False   # 标记是否在队列里面
        # 更新其他节点
        i = h[t]
        while i != -1:
            j = e[i]
            if dist[j] > dist[t] + val[i]:
                # 值变小
                dist[j] = dist[t] + val[i]
                if not st[j]:
                    # 没在队列里,避免多次不必要更新
                    q.append(j)
                    st[j] = True
            i = ne[i]
    return dist[n]
ans = spfa()
print('impossible' if ans == inf else ans)

感谢你看到这里!一起加油吧!

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值