PTA-数据结构与算法题目集(中文)— 编程题

目录

7-1 ~ 7-5

7-1 最大子列和问题

7-2 一元多项式的乘法与加法运算

7-3 树的同构

7-4 是否同一棵二叉搜索树

7-5 堆中的路径

7-6 ~ 7-10

7-6 列出连通集

7-7 六度空间

7-8 哈利·波特的考试

7-9 旅游规划

7-10 公路村村通

7-11 ~ 7-15

7-11 关键活动(部分)

7-12 排序

7-13 统计工龄

7-14 电话聊天狂人

7-15 QQ帐户的申请与登陆


题集链接:​PTA | 程序设计类实验辅助教学平台 (pintia.cn)​

7-1 ~ 7-5

7-1 最大子列和问题

k = int(input())
mn = acc = res = 0

for i in map(int, input().split()):
    acc += i
    if acc - mn > res:
        res = acc -mn
    if acc < mn:
        mn = acc
print(res)

7-2 一元多项式的乘法与加法运算

#include <bits/stdc++.h>
using namespace std;

map<int, int, greater<>> a, b, c, d;

void input(auto& p) {
    int k; cin >> k;
    for (int _ = k, i, j; _--;) {
        cin >> i >> j;
        p[j] = i, d[j] += i;
        if (!d[j]) d.erase(j);
    }
}

void output(auto& p) {
    int k = p.size();
    if (!k) {
        cout << "0 0\n";
        return;
    }
    for (auto& [j, i] : p)
        cout << i << ' ' << j << " \n"[!--k];
}

int main() {
    input(a), input(b);
    for (auto& [j, i] : a)
        for (auto& [n, m] : b) {
            c[j + n] += i * m;
            if (!c[j + n]) c.erase(j + n);
        }
    output(c), output(d);
    return 0;
}

7-3 树的同构

class Node:
    def __init__(self, v, l, r):
        self.v, self.l, self.r = v, l, r

def create_tree(n):
    tree = [None for _ in range(n)]
    is_root = [True] * n  # 初始化根节点候选列表
    for i in range(n):
        parts = input().split()
        value = parts[0]
        left = int(parts[1]) if parts[1].isdigit() else -1
        right = int(parts[2]) if parts[2].isdigit() else -1
        tree[i] = Node(value, left, right)
        if left != -1: is_root[left] = False
        if right != -1: is_root[right] = False
    for i in range(n):
        if is_root[i]:
            return tree, i  # 返回树和根节点索引
    return tree, -1

def isomorphism(num1, num2, tree1, tree2):
    if num1 == -1 and num2 == -1:  # 两个节点都为空
        return True
    if num1 == -1 or num2 == -1 or tree1[num1].v != tree2[num2].v:  # 不匹配
        return False
    if isomorphism(tree1[num1].l, tree2[num2].l, tree1, tree2) and isomorphism(tree1[num1].r, tree2[num2].r, tree1, tree2):
        return True
    if isomorphism(tree1[num1].l, tree2[num2].r, tree1, tree2) and isomorphism(tree1[num1].r, tree2[num2].l, tree1, tree2):
        return True
    return False

n1 = int(input())  # 第一棵树的节点数
t1, root1 = create_tree(n1)  # 创建第一棵树并找到根节点

n2 = int(input())  # 第二棵树的节点数
t2, root2 = create_tree(n2)  # 创建第二棵树并找到根节点

print("Yes" if isomorphism(root1, root2, t1, t2) else "No")

7-4 是否同一棵二叉搜索树

cin = lambda: list(map(int, input().split()))

def build(seq):
    t = [0] * (1 << 10)
    for i in seq:
        p = 1
        while t[p]:
            if t[p] > i: p = p << 1
            else: p = p << 1 | 1
        t[p] = i
    return t

t = cin()
while t[0]:
    tree = build(cin())
    for _ in range(t[1]):
        check = build(cin())
        print("Yes" if check == tree else "No")
    t = cin()

7-5 堆中的路径

q, c = [0] * 1005, 1
n, m = map(int, input().split())
for x in map(int, input().split()):
    q[c], t = x, c
    while t > 1 and q[t // 2] > q[t]:
        q[t // 2], q[t] = q[t], q[t // 2]
        t //= 2
    c += 1
for x in map(int, input().split()):
    res = []
    while x > 0:
        res.append(q[x])
        x //= 2
    print(*res)

7-6 ~ 7-10

7-6 列出连通集

from collections import *
n, m = map(int, input().split())
e = [[] for _ in range(n)]

for _ in range(m):
    u, v = map(int, input().split())
    e[u].append(v)
    e[v].append(u)

for i in range(n):
    e[i].sort()

vis = [False] * n

def dfs(u):
    vis[u] = True
    print(u, end=' ')
    for v in e[u]:
        if not vis[v]:
            dfs(v)

for i in range(n):
    if not vis[i]:
        print('{ ', end='')
        dfs(i)
        print('}')

vis, q = [False] * n, deque()
for i in range(n):
    if vis[i]: continue
    q.append(i); vis[i] = True
    print('{', end=' ')
    while q:
        u = q[0]; q.popleft()
        print(u, end=' ')
        for v in e[u]:
            if vis[v]: continue
            vis[v] = True
            q.append(v)
    print('}')

7-7 六度空间

from collections import *

n, m = map(int, input().split())
e = [[] for _ in range(n)]
for _ in range(m):
    u, v = map(int, input().split())
    e[u - 1].append(v - 1)
    e[v - 1].append(u - 1)
for i in range(n):
    q = deque([i])
    vis = [0] * n; vis[i] = 1
    for _ in range(6):
        for _ in range(len(q)):
            u = q[0]; q.popleft()
            for v in e[u]:
                if vis[v]: continue
                q.append(v)
                vis[v] = True
    print(f'{i + 1}: {sum(vis) * 100 / n:.2f}%')

7-8 哈利·波特的考试

from math import *
from collections import *

n, m = map(int, input().split())
e = [[] * (n) for _ in range(n)]
for _ in range(m):
    u, v, w = map(int, input().split())
    e[u - 1].append((v - 1, w))
    e[v - 1].append((u - 1, w))

idx, mn = 0, inf
for i in range(n):
    q, dis, inq = deque([i]), [inf] * n, [0] * n
    dis[i] = 0
    while q:
        u = q[0]; q.popleft()
        inq[u] = False
        for v, w in e[u]:
            if dis[u] + w < dis[v]:
                dis[v] = dis[u] + w
                if inq[v]: continue
                q.append(v)
                inq[v] = True
    if max(dis) < mn:
        mn, idx = max(dis), i

print(*[0] if mn == inf else [idx + 1, mn])

7-9 旅游规划

from math import *
from heapq import *

n, m, s, d = map(int, input().split())
e = [[] for _ in range(n)]
for _ in range(m):
    u, v, w, c = map(int, input().split())
    e[u].append((v, w, c))
    e[v].append((u, w, c))

dis, f, q = [inf] * n, [inf] * n, [(0, s)]
dis[s] = f[s] = 0

while q:
    d_, u = heappop(q)
    if d_ > dis[u]: continue
    if u == d: break
    for v, w, c in e[u]:
        if d_ + w < dis[v]:
            dis[v] = d_ + w
            f[v] = f[u] + c
            heappush(q, (dis[v], v))
        elif d_ + w == dis[v] and f[u] + c < f[v]:
            f[v] = f[u] + c

print(dis[d], f[d])

7-10 公路村村通

import heapq

n, m = map(int, input().split())
e = []
for _ in range(m):
    u, v, cost = map(int, input().split())
    e.append((u, v, cost))

parent = list(range(n + 1))

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

def union(x, y):
    rx, ry = find(x), find(y)
    if rx != ry:
        parent[ry] = rx
        return True
    return False

pq = []
for u, v, cost in e:
    heapq.heappush(pq, (cost, u, v))

total_cost = 0
edge_count = 0

while pq and edge_count < n - 1:
    cost, u, v = heapq.heappop(pq)
    if union(u, v):
        total_cost += cost
        edge_count += 1

print(-1 if edge_count < n - 1 else total_cost)

7-11 ~ 7-15

7-11 关键活动(部分)

from itertools import *
from collections import *

n, m = map(int, input().split())
e = [[] for _ in range(n)]
ind, dis, pre = [0] * n, [0] * n, [-1] * n
mx = 0

for _ in range(m):
    u, v, w = map(int, input().split())
    e[u - 1].append((v - 1, w))
    ind[v - 1] += 1

q = deque((u for u in range(n) if not ind[u]))

while q:
    u = q.popleft()
    for v, w in e[u]:
        if dis[u] + w > dis[v]:
            dis[v] = dis[u] + w
            pre[v] = u
        ind[v] -= 1
        if not ind[v]: q.append(v)
        if dis[v] > dis[mx]: mx = v

print(dis[mx])

inv = []
while ~mx:
    inv.append(mx)
    mx = pre[mx]

for u, v in pairwise(inv[::-1]):
    print(f'{u + 1}->{v + 1}')

7-12 排序

input()
print(*sorted(list(map(int, input().split()))))

7-13 统计工龄

#include <bits/stdc++.h>
using namespace std;

int n;
map<int, int> cnt;

int main() {
    cin >> n;
    for (int i = n, x; i--;) {
        cin >> x;
        cnt[x]++;
    }
    for (auto [x, c] : cnt)
        cout << x << ':' << c << endl;
    return 0;
}

7-14 电话聊天狂人

#include <bits/stdc++.h>
using namespace std;

int n, mx, m;
string s, res;
map<string, int> cnt;

int main() {
    cin >> n;
    for (int i = n * 2; i--;) {
        cin >> s;
        ++cnt[s];
    }
    for (auto [s, c] : cnt)
        if (c > mx) {
            mx = c, m = 1;
            res = s;
        } else if (c == mx)
            m++;
    cout << res << ' ' << mx;
    if (m > 1) cout << ' ' << m;
    return 0;
}

7-15 QQ帐户的申请与登陆

ac_pw = {}

for _ in range(int(input())):
    op, ac, pw = input().split()

    if op == 'L':
        if ac not in ac_pw:
            print("ERROR: Not Exist")
        elif ac_pw[ac] != pw:
            print("ERROR: Wrong PW")
        else:
            print("Login: OK")
    elif op == 'N':
        if ac in ac_pw:
            print("ERROR: Exist")
        else:
            ac_pw[ac] = pw
            print("New: OK")

持续更新中~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫谨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值