这题目难度对比历届是相当炸裂的简单了……题目也少了两道编程,应该是遇到创作瓶颈了
A:穿越时空之门
【问题描述】
随着 2024 年的钟声回荡,传说中的时空之门再次敞开。这扇门是一条神秘的通道,
它连接着二进制和四进制两个不同的数码领域,等待着勇者们的探索。
在二进制的领域里,勇者的力量被转换成了力量数值的二进制表示中各数位之和。
在四进制的领域里,力量的转换规则相似,变成了力量数值的四进制表示中各数位之和。
穿越这扇时空之门的条件是严苛的:当且仅当勇者在二进制领域的力量等同于四进制领域的力量时,
他才能够成功地穿越。
国王选定了小蓝作为领路人,带领着力量值从 1 到 2024 的勇者们踏上了这段探索未知的旅程。
作为小蓝的助手,你的任务是帮助小蓝计算出,在这 2024 位勇者中,有多少人符合穿越时空之门的条件。
【解析及代码】
省流:数字转成二进制、四进制,数位之和相等的数
答案:63
cnt = 0
for i in range(1, 2025):
# 二进制
bins = bin(i)[2:].count("1")
# 四进制
four = 0
while i:
four += i % 4
i //= 4
# 累加
cnt += bins == four
print(cnt)
B:数字串个数
【问题描述】
小蓝想要构造出一个长度为 10000 的数字字符串,有以下要求:
1) 小蓝不喜欢数字 0 ,所以数字字符串中不可以出现 0 ;
2) 小蓝喜欢数字 3 和 7 ,所以数字字符串中必须要有 3 和 7 这两个数字。
请问满足题意的数字字符串有多少个?这个数字会很大,你只需要输出其 对 ![10^9 + 7](https://latex.csdn.net/eq?10%5E9%20+%207) 取余后的结果。
【解析及代码】
容斥原理秒杀
答案:157509472
mod = int(1e9 + 7)
n = 10000
cnt = pow(9, n, mod)
# 去除 no(3) + no(7) 的情况
cnt -= 2 * pow(8, n, mod)
# 补上 no(3 and 7) 的情况
cnt += pow(7, n, mod)
print(cnt % mod)
C:连连看
【问题描述】
小蓝正在和朋友们玩一种新的连连看游戏。在一个 n × m 的矩形网格中, 每个格子中都有一个整数,第 i 行第 j 列上的整数为 ![A_{i,j}](https://latex.csdn.net/eq?A_%7Bi%2Cj%7D)。玩家需要在这个网 格中寻找一对格子 ![(a, b) - (c, d)](https://latex.csdn.net/eq?%28a%2C%20b%29%20-%20%28c%2C%20d%29) 使得这两个格子中的整数 ![A_{a,b}](https://latex.csdn.net/eq?A_%7Ba%2Cb%7D) 和 ![A_{c,d}](https://latex.csdn.net/eq?A_%7Bc%2Cd%7D) 相等,且 它们的位置满足 ![|a-c|=|b-d|>0](https://latex.csdn.net/eq?%7Ca-c%7C%3D%7Cb-d%7C%3E0) 。请问在这个 n × m 的矩形网格中有多少对 这样的格子满足条件。
【输入格式】
输入的第一行包含两个正整数 n, m ,用一个空格分隔。
接下来 n 行,第 i 行包含 m 个正整数 ![A_{i,1}, A_{i,2}, \cdots, A_{i,m}](https://latex.csdn.net/eq?A_%7Bi%2C1%7D%2C%20A_%7Bi%2C2%7D%2C%20%5Ccdots%2C%20A_%7Bi%2Cm%7D),相邻整数之间使 用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例】
输入 | 输出 | 说明 |
3 2 1 2 2 3 3 2 | 6 | 一共有以下 6 对格子: (1, 2) − (2, 1) ,(2, 2) − (3, 1) , (2, 1) − (3, 2) ,(2, 1) − (1, 2) , (3, 1) − (2, 2) ,(3, 2) − (2, 1) 。 |
【评测用例规模与约定**】**
20% | |
100% |
【解析及代码】
根据题意可知,(a, b) - (c, d) 中的两个元素位于同一斜线上
(1, 2) - (2, 1) 和 (2, 1) - (1, 2) 算不同的两对,优化一下比较流程计算结果即可
n, m = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(n)]
# A[a][b] = A[c][d], 处于同一斜线上
cnt = 0
for i in range(n):
for j in range(m):
# 只跟当前行以下的行比较
# 向左下角
for p in range(1, min(n - i, j + 1)):
cnt += A[i][j] == A[i + p][j - p]
# 向右下角
for p in range(1, min(n - i, m - j)):
cnt += A[i][j] == A[i + p][j + p]
print(cnt * 2)
D:神奇闹钟
【问题描述】
小蓝发现了一个神奇的闹钟,从纪元时间(1970 年 1 月 1 日 00:00:00 )开 始,每经过 x 分钟,这个闹钟便会触发一次闹铃(纪元时间也会响铃)。这引起 了小蓝的兴趣,他想要好好研究下这个闹钟。
对于给出的任意一个格式为 yyyy-MM-dd HH:mm:ss 的时间,小蓝想要 知道在这个时间点之前(包含这个时间点)的最近的一次闹铃时间是哪个时间?
注意,你不必考虑时区问题。
【输入格式】
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每组数据一行,包含一个时间(格式为 yyyy-MM-dd HH:mm:ss)和一 个整数 x ,其中 x 表示闹铃时间间隔(单位为分钟)。
【输出格式】
输出 T 行,每行包含一个时间(格式为 yyyy-MM-dd HH:mm:ss),依次表示每组数据的答案。
【样例】
输入 | 输出 |
2 2016-09-07 18:24:33 10 2037-01-05 01:40:43 30 | 2016-09-07 18:20:00 2037-01-05 01:30:00 |
【评测用例规模与约定**】**
100% |
【解析及代码】
What can I say?
import time
fmt = "%Y-%m-%d %H:%M:%S"
for _ in range(int(input())):
datetime, x = input().rsplit(maxsplit=1)
x = int(x) * 60
t = round(time.mktime(time.strptime(datetime, fmt)))
print(time.strftime(fmt, time.localtime(t - t % x)))
E:蓝桥村的真相
【问题描述】
在风景如画的蓝桥村,n 名村民围坐在一张古老的圆桌旁,参与一场思想 的较量。这些村民,每一位都有着鲜明的身份:要么是誉满乡野的诚实者,要 么是无可救药的说谎者。
当会议的钟声敲响,一场关于真理与谬误的辩论随之展开。每位村民轮流 发言,编号为 i 的村民提出了这样的断言:坐在他之后的两位村民——也就是 编号 i + 1 和 i + 2(注意,编号是环形的,所以如果 i 是最后一个,则 i + 1 是 第一个,以此类推)之中,一个说的是真话,而另一个说的是假话。
在所有摇曳不定的陈述中,有多少真言隐藏在谎言的面纱之后?
请你探索每一种可能的真假排列组合,并计算在所有可能的真假组合中, 说谎者的总数。
【输入格式】
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每个数据一行包含一个整数 n,表示村落的人数。
【输出格式】
输出 T 行,每行包含一个整数,依次表示每组数据的答案。
【样例】
输入 | 输出 | 说明 |
2 3 3 | 6 6 | 可能的组合有 「假,假,假」「真,真,假」 「真,假,真」「假, 真,真」 说谎者的总数为 3 + 1 + 1 + 1 = 6。 |
【评测用例规模与约定**】**
10% | |
40% | |
100% |
【解析及代码】
1 表谎言,0 表真言,每 3 个人可能的组合有:010, 001, 100, 111
前三种情况:100 是一个循环 (第三人是前两人的“同或”),如果 n 能被 3 整除,这三种情况就贡献了 n 个说谎的
第四种情况:全都是 111,贡献了 n 个说谎的
for _ in range(int(input())):
n = int(input())
print(n * (1 + (n % 3 == 0)))
F:魔法巡游
【问题描述】
在蓝桥王国中,两位魔法使者,小蓝与小桥,肩负着维护时空秩序的使命。 他们每人分别持有 N 个符文石,这些石头被赋予了强大的力量,每一块上都刻 有一个介于 1 到 ![10^9](https://latex.csdn.net/eq?10%5E9) 之间的数字符号。小蓝的符文石集合标记为 ![s_1, s_2, \cdots, s_N](/image/aHR0cHM6Ly9sYXRleC5jc2RuLm5ldC9lcT9zXzE%3D%2C%20s_2%2C%20%5Ccdots%2C%20s_N), 小桥的则为 ![t_1, t_2, \cdots, t_N](https://latex.csdn.net/eq?t_1%2C%20t_2%2C%20%5Ccdots%2C%20t_N)。
两位魔法使者的任务是通过使用符文石,在各个时空结点间巡游。每次巡游遵循这样一条法则:当小蓝使用了符文石 ![s_i](https://latex.csdn.net/eq?s_i) 到达新的结点后,小桥必须选用 一个序号更大的符文石(即某个 ![t_j](https://latex.csdn.net/eq?t_j) 满足 j > i)前往下一个结点。同理,小桥抵 达之后,小蓝需要选择一个序号 k > j 的符文石 ![s_k](https://latex.csdn.net/eq?s_k) 继续他们的巡游。
为了成功地穿梭时空,两个连续使用的符文石上的数字符号必须有共鸣, 这种共鸣只有当数字符号中至少包含一个特定的元素——星火(数字 0)、水波 (数字 2)或者风语(数字 4)时,才会发生。例如,符号序列 126, 552, 24, 4 中 的每对连续符文都包含了至少一个共鸣元素,则它们是一系列成功的巡游;而 如果是 15, 51, 5,则不成立,因为它们之间的共鸣元素不包含星火、水波或风语 中的任意一个。
小蓝总是先启程,使用他的符文石开启巡游。
你的任务是计算这对魔法使者能够执行的最长时空巡游序列的长度。这样 的序列形式为 ![s_{i_i}, t_{i_2}, s_{i_3}, t_{i_4}, \cdots](https://latex.csdn.net/eq?s_%7Bi_i%7D%2C%20t_%7Bi_2%7D%2C%20s_%7Bi_3%7D%2C%20t_%7Bi_4%7D%2C%20%5Ccdots),其中序列索引满足 ![i_1 < i_2 < i_3 < i_4 < \cdots](https://latex.csdn.net/eq?i_1%20%3C%20i_2%20%3C%20i_3%20%3C%20i_4%20%3C%20%5Ccdots),并且序列中每一对相邻的符文石都至少包含一个共鸣元素。
【输入格式】
输入的第一行包含一个整数 N,表示每位魔法使者持有的符文石数量。
第二行包含 N 个整数 ![s_1, s_2, \cdots, s_N](/image/aHR0cHM6Ly9sYXRleC5jc2RuLm5ldC9lcT9zXzE%3D%2C%20s_2%2C%20%5Ccdots%2C%20s_N) ,相邻整数之间使用一个空格分隔,表示小蓝的符文石上刻有的数字符号。
第三行包含 N 个整数 ![t_1, t_2, \cdots, t_N](https://latex.csdn.net/eq?t_1%2C%20t_2%2C%20%5Ccdots%2C%20t_N) ,相邻整数之间使用一个空格分隔,表示小桥的符文石上刻有的数字符号。
【输出格式】
输出一行包含一个整数,表示小蓝和小桥在遵守所有规则的情况下,最多能进行多少次时空巡游。
【样例】
输入 | 输出 | 说明 |
5 126 393 581 42 44 204 990 240 46 52 | 4 | 小蓝和小桥可以选择以下符文石序列进行巡游: (126) → (240) → (42) → (52) 这里,数字 2 作为共鸣元素连接了 和 、 和 t,数字 2、4 作为共鸣元素 连接了 和 。 |
【评测用例规模与约定**】**
30% | |
100% |
【解析及代码】
编写类 Element,重写 __init__ 方法以搜集符文石的特定元素,存储到 set 中
存储非空的 Element 的索引,结合 bisect 的二分查找加速枚举,直接动态规划
import bisect
class Element(set):
base = {"0", "2", "4"}
def __init__(self, s):
super().__init__(set(s) & self.base)
n = int(input())
e_lan = list(map(Element, input().split()))
e_qiao = list(map(Element, input().split()))
# 编制非空元素的索引
i_lan = [i for i in range(n) if e_lan[i]]
i_qiao = [i for i in range(n) if e_qiao[i]]
if not (i_lan and i_qiao):
print(1)
# 两者都非空
else:
# 小蓝先出发
dp = [[0, 0] for _ in range(n)]
for i in i_lan: dp[i][0] = 1
res = 0
for i in sorted(set(i_lan + i_qiao)):
j_lan = bisect.bisect_left(i_lan, i)
j_qiao = bisect.bisect_left(i_qiao, i)
# 小蓝出发
if i_lan[j_lan] == i:
for src in i_qiao[:j_qiao]:
if e_qiao[src] & e_lan[i]:
dp[i][0] = max(dp[i][0], dp[src][1] + 1)
# 小桥出发
if i_qiao[j_qiao] == i:
for src in i_lan[:j_lan]:
if e_lan[src] & e_qiao[i]:
dp[i][1] = max(dp[i][1], dp[src][0] + 1)
res = max(res, max(dp[i]))
print(res)
G:缴纳过路费
【问题描述】
在繁华的商业王国中,N 座城市被 M 条商路巧妙地连接在一起,形成了一 个错综复杂的无向图网络。每条商路是双向通行的,并且任意两座城市之间最 多只有一条直接的商路。每条商路都有它的规则,其中最引人注目的就是穿过商路,需要缴纳过路费。因此,商人们在选择商路时必须格外认真。
有一位名叫小蓝的商人,他对于商路的花费有着自己独到的见解。在小蓝 眼中,一条路线包含一条或多条商路,但路线的成本并不是沿途累积的过路费总和,而是这条路线上最贵的那一次收费。这个标准简单而直接,让他能迅速 评估出一条路线是否划算。
于是,他设立了一个目标,即找出所有城市对,这些城市之间的最低路线 成本介于他心中预设的两个数 L 和 R 之间。他相信,这样的路线既不会太廉 价,以至于路况糟糕;也不会过于昂贵,伤害他精打细算的荷包。
作为小蓝的助手,请你帮助小蓝统计出所有满足条件的城市对数量。
【输入格式】
输入的第一行包含四个整数 N, M, L, R,表示有 N 座城市和 M 条双向通行 的商路,以及小蓝心中预设的最高过路费的下限 L 和上限 R。
接下来 M 行,每行包含三个整数 u, v, w,表示城市 u 和城市 v 之间有一条 双向通行的商路,过路费为 w。保证每对城市之间最多只有一条直接的商路。
【输出格式】
输出一行包含一个整数,表示满足条件的城市对数量。
【样例】
输入 | 输出 | 说明 |
5 5 1 2
1 2 2
1 3 5
1 4 1
2 4 5
2 5 4
| 3 | 满足条件的城市对有 (1, 2),(1, 4),(2, 4) |
【评测用例规模与约定**】**
30% | |
100% |
【解析及代码】
注:经大佬提醒,发现该题做法错误,应该是 Kruskal + 并查集 (正确的做法有空再研究)。如果将题目条件中“过路费最贵的一次∈[L, R]”改为“过路费∈[L, R]”,则是以下做法
边权不在 [L, R] 范围内的边都可以忽略
对每个结点,使用列表 dset 记录所连接的、序号比其小的结点 (也就是并查集所说的“前驱”),从而使 dset 描述若干棵结点树
例如对于 dset = [0, 0, 1, 3, 2],结点 0,1,2,4 处于同一棵树内,结点 3 则独自构成一棵树。而结点 0,1,2,4 两两之间连通,所以这棵树贡献了 个城市对,而第二颗树无贡献
对 dset 中的结点扫描一次,即可找到每个结点所对应的“祖先结点”:
- dset[0] == 0:跳过
- dset[1] != 1:dset[1] = dset[dset[1]] = dset[0] = 0
- dset[2] != 2:dset[2] = dset[dset[2]] = dset[1] = 0
- dset[3] == 3:跳过
- dset[4] != 4:dset[4] = dset[dset[4]] = dset[2] = 0
从而使得 dset 转变为 [0, 0, 0, 3, 0],使用 Counter 统计每棵树的结点数量 (筛除只有 1 个结点的),根据结点数 v 累加 即可
from collections import Counter
n, m, l, r = map(int, input().split())
class DisjointSet(list):
def __init__(self):
# s.j.: self[i] < i
super().__init__(range(n))
def find_ancestor(self):
# 按顺序找到所有结点的祖先结点
for i in range(n):
self[i] = self[self[i]]
def export(self):
# 统计每个祖先结点的族群规模, 筛选出族群规模 > 1 的族群
return sum(v * (v + 1) // 2
for v in filter((1).__lt__, Counter(self).values()))
dset = DisjointSet()
for _ in range(m):
u, v, w = map(int, input().split())
# 只存储符合条件的边
if l <= w <= r:
u, v = sorted(map((-1).__add__, (u, v)))
# 存储序号最大的
dset[v] = max(u, 0 if dset[v] == v else dset[v])
dset.find_ancestor()
print(dset.export())
H:纯职业小组
【问题描述】
在蓝桥王国,国王统治着一支由 n 个小队组成的强大军队。每个小队都由相同职业的士兵组成。具体地,第 i 个小队包含了 ![b_i](https://latex.csdn.net/eq?b_i) 名职业为 ![a_i](https://latex.csdn.net/eq?a_i) 的士兵。
近日,国王计划在王宫广场举行一场盛大的士兵检阅仪式,以庆祝王国的繁荣昌盛。然而,在士兵们入场的过程中,一场突如其来的风暴打乱了他们的 行列,使得不同小队的士兵混杂在一起,次序乱成一团,
尽管国王无法知道每个士兵的具体职业,但为了确保仪式能顺利进行,国王打算从这些混乱的士兵中选出一部分,组成 k 个“纯职业小组”进行检阅。 一个“纯职业小组”定义为由 3 名同职业的士兵组成的队伍。
请问,国王至少需要选择多少名士兵,才能确保这些士兵可以组成 k 个 “纯职业小组”。
【输入格式】
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每组数据的第一行包含两个整数 ![n_t](https://latex.csdn.net/eq?n_t) 和 k ,用一个空格分隔,表示小队的数量和要组成的纯职业小组的数量。
接下来的 ![n_t](https://latex.csdn.net/eq?n_t) 行,每行包含两个整数 ![a_i](https://latex.csdn.net/eq?a_i) 和 ![b_i](https://latex.csdn.net/eq?b_i) ,用一个空格分隔,表示第 i 个小队中士兵的职业和数量。
【输出格式】
输出 T 行,每行包含一个整数,依次表示每组数据的答案,即为了组成 k 个“纯职业小组”,国王至少需要选择的士兵数量。如果无论如何也无法组成 k 个“纯职业小组”,则输出 −1。
【样例】
输入 | 输出 | 说明 |
2 3 2 1 3 2 3 3 3 3 5 1 3 2 3 3 3 | 8 -1 | 在第一个样例中,要想组成 2 个“纯职业小组”, 国王至少需要选择 8 名士兵。若只选择了 7 名士兵, 则这 7 名士兵的职业可能为 1, 1, 1, 2, 2, 3, 3, 无法组成 2 个“纯职业小组”。 在第二个样例中,即使选择了所有士兵, 也无法组成 5 个“纯职业小组”, 因此输出 −1。 |
【评测用例规模与约定**】**
50% | |
100% |
【解析及代码】
三种职业为 3 6 9,需选定 3 组时,最坏的情况是选 2 5 5 (再任意 + 1)
需选定 4 组时,最坏的情况是选 2 5 8 (再任意 + 1)
难办啊,那就不办了 (有空再说)
🤝 期待与你共同进步
🌱 亲爱的读者,非常感谢你每一次的停留和阅读!你的支持是我们前行的最大动力!🙏
🌐 在这茫茫网海中,有你的关注,我们深感荣幸。你的每一次点赞👍、收藏🌟、评论💬和关注💖,都像是明灯一样照亮我们前行的道路,给予我们无比的鼓舞和力量。🌟
📚 我们会继续努力,为你呈现更多精彩和有深度的内容。同时,我们非常欢迎你在评论区留下你的宝贵意见和建议,让我们共同进步,共同成长!💬
💪 无论你在编程的道路上遇到什么困难,都希望你能坚持下去,因为每一次的挫折都是通往成功的必经之路。我们期待与你一起书写编程的精彩篇章! 🎉
🌈 最后,再次感谢你的厚爱与支持!愿你在编程的道路上越走越远,收获满满的成就和喜悦!
关于Python学习指南
如果你对Python感兴趣,想通过学习Python获取更高的薪资,那下面这套Python学习资料一定对你有用!
资料包括:Python安装包+激活码、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。0基础小白也能听懂、看懂,跟着教程走,带你从零基础系统性地学好Python!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python学习软件
工欲善其事,必先利其器。学习Python常用的开发软件都在这里了!
三、Python入门学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
四、Python练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
五、Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。这份资料也包含在内的哈~
六、Python面试资料
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
七、资料领取
上述完整版Python全套学习资料已经上传CSDN官方,需要的小伙伴可自行微信扫描下方CSDN官方认证二维码免费领取