【问题描述】 小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的 字符 Tc。下表给出了字符变换的规则: 例如,将字符串 YeRi 加密可得字符串 EaFn。 小明有一个随机的字符串,加密后为 EaFnjISplhFviDhwFbEjRjfIBBkRyY 试题 A: 解密 2 第十一届蓝桥杯大赛软件类省赛 Python 大学组 (由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少? (如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容 是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符 串,后面 52 行依次为表格中的内容。) 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写 多余的内容将无法得分。
模拟就行
2020 年 7 月 1 日是中国共产党成立 99 周年纪念日。 中国共产党成立于 1921 年 7 月 23 日。 请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包 含多少分钟?
import datetime def cal(s, e): s1 = datetime.datetime.strptime(s, "%Y-%m-%d %H") e1 = datetime.datetime.strptime(e, "%Y-%m-%d %H") print((e1-s1).total_seconds()/60) print(int(str(e1-s1).split()[0])*24*60) cal("1921-7-23 12","2020-7-1 12") # 52038720【问题描述】 附件 prog.txt 中是一个用某种语言写的程序。 其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达, 从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。 例如如下片段: 该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的 循环两次中。 REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。 A = A + 5 实际总共的循环次数是 2×5×6 = 60 次。 请问该程序执行完毕之后,A 的值是多少? 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
会python的直接改成python即可,241830
with open("C:/Users/17861/Desktop/prog.txt") as f: data = f.readlines() A = 0 n = len(data) tt = -1 st = [0 for i in range(n)] def cal(s): cnt = 0 x = 0 flag = 0 for i in range(len(s)): if (s[i] == ' '): cnt += 1 else: if s[i] == "A": flag = 1 x = int(s[i:].split()[-1]) else: flag = 0 # print(s, len(s), ":",s[i:]) x = int(s[i:].split()[-1][:-1]) break return cnt // 4, flag, x res = 0 pre = 0 mul = 1 for i in range(1, n): if len(data[i]) < 5: continue cnt, flag, x = cal(data[i]) # print(data[i],cnt,flag,x) if pre <= cnt: pre = cnt if flag == 0: mul *= x tt += 1 st[tt] = x else: res += mul * x else: while pre > cnt: # print(pre, tt, st[tt]) mul //= st[tt] tt -= 1 pre -= 1 if flag == 0: mul *= x tt += 1 st[tt] = x else: res += mul * x print(res) # 241830本题总分:10 分 【问题描述】 把 1 ∼ 2020 放在 2×1010 的矩阵里。要求同一行中右边的比左边大,同一 列中下边的比上边的大。一共有多少种方案? 答案很大,你只需要给出方案数除以 2020 的余数即可。 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
卡特兰数:参考数论知识
考虑把 1-2n 从小到大依次放进矩阵中,可以发现每次放置的位置只能是第一行的最左空位或第二行的最左空位(否则左边一定会放一个更大的元素,而这不合法)。同时,如果放在第二行,那么要保证它上方已经有数字(否则会放一个更大的进去,同样不合法)。那么这样子可以把放在第一行看成 (,放在第二行看成 ),也就是计数长度为 2n的合法括号序列。根据卡特兰数,这个数量为
# n = int(input()) MOD = 2020 N = 3000 c = [[0 for j in range(N)] for i in range(N)] n = 1010 for i in range(0, N): for j in range(0, i+1): if j == 0: c[i][j] = 1 else: c[i][j] = (c[i-1][j] + c[i-1][j-1]) % MOD print(((c[2*n][n]-c[2*n][n-1]) % MOD + MOD) % MOD) # 1340或者DP(集合表示一类方案)
# n = int(input()) MOD = 2020 N = 3000 dp = [[0 for j in range(N)] for i in range(N)] n = 1010 dp[0][0] = 1 # 不放也是方案 for i in range(0, n+1): for j in range(0, n+1): if i != 0 and i >= j-1: # 转移前的状态也要合法,即第一行的数量不小于第二行的数量 dp[i][j] = (dp[i][j] + dp[i-1][j])%MOD if j != 0 : dp[i][j] = (dp[i][j] + dp[i][j-1])%MOD print(dp[n][n]) # 1340解释:
提高题:AcWing 271. 杨老师的照相排列
从小到大,在每一排里,当前排好的人在左边连续一段。
yxc大佬:
本题总分:15 分 【问题描述】 如果整个整数 X 本身是完全平方数,同时它的每一位数字也都是完全平方 数,我们就称 X 是完美平方数。 前几个完美平方数是 0、1、4、9、49、100、144…… 即第 1 个完美平方数是 0,第 2 个是 1,第 3 个是 4,…… 请你计算第 2020 个完美平方数是多少? 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
超时
x = 0 cnt = 0 n = 2020 def check(x): if int(pow(x, 0.5)) * int(pow(x, 0.5)) != x: return 0 return 1 a = [0, 1, 4, 9] res = [] def dfs(u, num, flag): if num == 0: if check(u) == 1: res.append(u) if len(res) >= 1000: print(res return for i in range(0, len(a)): if flag != 1 and num == flag and i == 0: continue dfs(int(str(u) + str(a[i])), num-1, flag) num = 1 while True: dfs(0, num, num) num += 1 if len(res) >= n: break print(res[2020])下面的程序题,没法验证,口胡就行。
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 【问题描述】 输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字 母,多少个数字。 【输入格式】 输入一行包含一个字符串。 【输出格式】 输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。 【样例输入】 1+a=Aab 【样例输出】 1 3 1 【评测用例规模与约定】 对于所有评测用例,字符串由可见字符组成,长度不超过 100。
有手就行。
s = input() cnt1, cnt2, cnt3 = 0, 0 , 0 for it in s: if it <= '9' and it >= '0': cnt1 += 1 elif it <= 'z' and it >= 'a': cnt2 += 1 elif it <= 'Z' and it >= 'A': cnt3 += 1 print(cnt3) print(cnt2) print(cnt1)时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 【问题描述】 给定正整数 n, 求 18 + 28 +···+ n8 mod 123456789 。其中 mod 表示取 余。 【输入格式】 输入的第一行包含一个整数 n。 【输出格式】 输出一行,包含一个整数,表示答案。 【样例输入】 2 【样例输出】 257 【样例输入】 987654 【样例输出】 43636805 【评测用例规模与约定】 对于 20% 的评测用例,1≤n≤20。 对于 60% 的评测用例,1≤n≤1000。 对于所有评测用例,1≤n≤1000000。
快速幂, python内置的pow是基于快速幂的
IA = lambda:map(int, input()) MOD = 123456789 res = 0 n = int(input()) for i in range(1, n+1): res = (res + pow(i, 8, MOD)) % MOD print(res)时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 【问题描述】 小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大 写字母,小明将它转换成它在 26 个英文字母中序号,即 A→1, B→2, … Z→ 26。 这样一个字符串就能被转化成一个数字序列: 比如 ABCXYZ → 123242526。 现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样 的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字 符串。 【输入格式】 一个数字序列。 【输出格式】 一个只包含大写字母的字符串,代表答案 【样例输入】 123242526 【样例输出】 LCXYZ 【评测用例规模与约定】 对于 20% 的评测用例,输入的长度不超过 20。 对于所有评测用例,输入的长度不超过 200000
贪心凑最大的就行
s = input() base = ord('A') pre = s[0] for i in range(1, len(s)): if pre == "-1": pre = s[i] continue x = int(pre + s[i]) if x > 26: x = int(pre) pre = s[i] else: pre = "-1" print(chr(base + x - 1), end="") if pre != "-1": x = int(pre) print(chr(base + x - 1), end="")时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 【问题描述】 给定一棵包含 N 个节点的二叉树,节点编号是 1 ∼ N。其中 i 号节点具有 权值 Wi,并且这些节点的权值恰好形成了一棵排序二叉树 (BST)。 现在给定一个节点编号 K,小明想知道,在这 N 个权值以外,有多少个整 数 X (即 X 不等于任何 Wi ) 满足:给编号为 K 的节点增加一个权值为 X 的子 节点,仍可以得到一棵 BST。 例如在下图中,括号外的数字表示编号、括号内的数字表示权值。即编号 1∼4 的节点权值依次是 0、10、20、30。 如果 K = 1,那么答案为 0。因为 1 号节点已经有左右子节点,不能再增 加子节点了。 如果 K = 2,那么答案为无穷多。因为任何一个负数都可以作为 2 的左子 节点。 如果 K = 3,那么答案为 9。因为 X = 11,12,··· ,19 都可以作为 3 的左子 节点。 【输入格式】 第一行包含 2 个整数 N 和 K。 以下 N 行每行包含 2 个整数,其中第 i 行是编号为 i 的节点的父节点编号 Pi 和权值 Wi 。注意 Pi = 0 表示 i 是根节点。 输入保证是一棵 BST。 试题 I: BST 插入节点问题 11 第十一届蓝桥杯大赛软件类省赛 Python 大学组 【输出格式】 一个整数代表答案。如果答案是无穷多,输出 −1。 【样例输入】 4 3 0 10 1 0 1 20 3 30 【样例输出】 9 【评测用例规模与约定】 对于 60% 的评测用例,1≤ K ≤ N ≤100,0≤Wi ≤200,且 Wi 各不相同。 对于所有评测用例,1 ≤ K ≤ N ≤ 10000,0 ≤ Wi ≤ 100000000,且 Wi 各不 相同。
IA = lambda:map(int, input().split()) N = 10010 l = [-1 for i in range(N)] r = [-1 for i in range(N)] fa = [-1 for i in range(N)] n, k = IA() w = [[0, 0] for i in range(n)] for i in range(1, n+1): a, b = IA() fa[i] = a if a == 0: root = i w[i-1][0] = b w[i-1][1] = i for i in range(1, n+1): if i == root: continue if w[i-1][0] <= w[fa[i]-1][0]: l[fa[i]] = i else: r[fa[i]] = i w = sorted(w) pos = 0 for i in range(n): if w[i][1] == k: pos = i # print(pos) if l[k] != -1 and r[k] != -1: print(0) elif pos == 0 or pos == n-1: print(-1) else: if l[k] == -1 and r[k] == -1: print(w[pos+1][0] - w[pos-1][0] - 2) elif l[k] != -1 and r[k] == -1: print(w[pos+1][0] - w[pos][0] - 1) elif l[k] == -1 and r[k] != -1: print(w[pos][0] - w[pos-1][0] - 1)时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 【问题描述】 小明正在做一个网络实验。 他设置了 n 台电脑,称为节点,用于收发和存储数据。 初始时,所有节点都是独立的,不存在任何连接。 小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信 了。两个节点如果存在网线连接,称为相邻。 小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送 到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接 或间接相邻的节点都收到了信息。所有发送和接收的节点都会将信息存储下来。 一条信息只存储一次。 给出小明连接和测试的过程,请计算出每个节点存储信息的大小。 【输入格式】 输入的第一行包含两个整数 n,m,分别表示节点数量和操作数量。节点从 1 至 n 编号。 接下来 m 行,每行三个整数,表示一个操作。 如果操作为 1 a b,表示将节点 a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。 如果操作为 2 p t,表示在节点 p 上发送一条大小为 t 的信息。 【输出格式】 输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行 完上述操作后节点 1 至节点 n 上存储信息的大小。 试题J: 网络分析 13 第十一届蓝桥杯大赛软件类省赛 Python 大学组 【样例输入】 4 8 1 1 2 2 1 10 2 3 5 1 4 1 2 2 2 1 1 2 1 2 4 2 2 1 【样例输出】 13 13 5 3 【评测用例规模与约定】 对于 30% 的评测用例,1≤n≤20,1≤m≤100。 对于 50% 的评测用例,1≤n≤100,1≤m≤1000。 对于 70% 的评测用例,1≤n≤1000,1≤m≤10000。 对于所有评测用例,1≤n≤10000,1≤m≤100000,1≤t≤100。
带权并查集,d表示每一个点与根节点的差值(带正负)。
N = 1000010 IA = lambda:map(int, input().split()) n, m = IA() fa = [i for i in range(N)] d = [0 for i in range(N)] res = [0 for i in range(N)] def get(x): if x != fa[x]: t = fa[x] fa[x] = get(fa[x]) d[x] += d[t] # 它到父节点的距离 + 它到根节点的距离 return fa[x] for _ in range(m): a, b, c = IA() if a == 1: fx = get(b) fy = get(c) if fx != fy: fa[fy] = fx d[fy] = res[fy] - res[fx] else: f = get(b) res[f] += c for i in range(1, n+1): print(res[get(i)] + d[i],end = " ")