目录
题集链接: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")
持续更新中~