
第十次10.1涉及到知识点如下坑OJ 不能写input(提示文字)模块具体知识点对应代码难度字符判断str.isdigit()判断数字字符if ch.isdigit():⭐字符串拆分str.split()按分隔符切分a, b s.split()⭐⭐数字拼接逐字符拼整数num*10digitnum num*10 int(ch)⭐⭐⭐字符转数字int(ch)单个字符→整数int(ch)⭐ASCII 编码字符范围 58~126 的含义概念题⭐⭐s input() a_str, b_str s.split() # 题目保证只有一个,恰好拆成A和B def to_int(part): num 0 for ch in part: if ch.isdigit(): # 只保留数字,天然忽略奇怪字符和空格 num num * 10 int(ch) return num total to_int(a_str) to_int(b_str) print(Too Big if total 10 ** 9 else total)10.2博弈论 队列deque 贪心 时间戳建模属于信奥入门经典博弈题。一、基础数据结构双端队列 dequedeque 的核心操作popleft()弹出队首\(O(1)\)。普通列表list.pop(0)是\(O(n)\)大数据会超时这是本题选 deque 的关键。append()追加到队尾\(O(1)\)。代码设计分开两个队列L 队列存所有存活 L 的时间戳R 队列存存活 R 的时间戳不是保存人的字符而是保存发言优先级时间戳。考点什么时候用 deque需要频繁从队首弹出元素的时候。二. 导入库from collections import dequecollectionsPython 标准库deque双端队列append()、popleft()两端操作 O (1)三.内置函数函数作用enumerate()遍历同时返回下标和元素# 导入双端队列deque用于O(1)的队首弹出、队尾追加操作 from collections import deque # 读取对决的总次数T t int(input()) # 循环处理每一组测试用例 for _ in range(t): # 读取当前对决的初始发言序列字符串 s input() # L队列存放存活L队员的时间戳代表发言优先级数字越小越先发言 L deque() # R队列存放存活R队员的时间戳 R deque() # enumerate同时遍历下标i和字符ch初始化两队的时间戳初始时间戳就是原始下标 for i, ch in enumerate(s): if ch L: L.append(i) else: R.append(i) # time分配给发言完毕、重新放回队尾的人的新时间戳 # 原始下标范围0~len(s)-1所以新时间戳从 len(s) 开始保证更大 time len(s) # 只要L、R两队都还有存活的人对决继续 while L and R: # 比较两队下一个发言人的时间戳时间戳小的人优先发言 if L[0] R[0]: # L队首的人获得发言机会移出L队列 L.popleft() # L选择最优策略淘汰R队下一个即将发言的对手 R.popleft() # 发言完毕L存活分配新时间戳放回L队列末尾 L.append(time) # 时间戳自增给下一个重新入队的人使用 time 1 else: # R队的人时间戳更小R优先发言 # R队首移出轮到发言 R.popleft() # R淘汰L队下一个即将发言的对手 L.popleft() # R发言结束分配新时间戳放回R队列末尾 R.append(time) time 1 # 循环结束其中一队全部被淘汰。L非空则L胜否则R胜三元条件表达式 ans L if L else R # 输出获胜队伍 print(ans)10.3