笔记草稿
薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
1.输入字符包括,“(” , “)” 和 "<“和其他字符。
2.其他字符表示笔记内容。
3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。
4.”<“表示退格, 删去前面一个笔记内容字符。括号不受”<"影响 。
import sys
for line in sys.stdin:
stack = [] # 用于存储最终的字符
skip = 0 # 用于标记是否在注释内部
for char in line:
if char == '(': # 开始注释
skip += 1
elif char == ')' and skip > 0: # 结束注释
skip -= 1
elif skip == 0: # 当不在注释区间内
if char == '<': # 处理退格
if stack: # 确保栈不为空
stack.pop()
else:
stack.append(char) # 添加字符到最终结果
print(''.join(stack)) # 将字符列表转换成字符串并返回
笔记精选
薯队长写了n篇笔记,编号从1~n,每篇笔记都获得了不少点赞数。
薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:
1.不能出现连续编号的笔记。
2.总点赞总数最多
如果满足1,2条件有多种方案,挑选笔记总数最少的那种
# 读取数组长度,但是如果不需要可以忽略
n = int(input())
# 读取数组元素,以空格分隔,并将其转换为整数列表
notes= list(map(int, input().split()))
def max_likes_without_consecutive(A):
# 确保笔记数量与点赞数列表长度一致
assert len(notes) > 0, "Notes list should not be empty."
# 初始化两个状态:包含和不包含当前笔记的最大点赞数以及笔记数量
include = (notes[0], 1) if len(notes) > 0 else (0, 0)
exclude = (0, 0)
for note in notes[1:]:
# 新的不包含当前笔记的状态
new_exclude = max(include, exclude, key=lambda x: (x[0], -x[1]))
# 包含当前笔记的状态
include = (exclude[0] + note, exclude[1] + 1)
exclude = new_exclude
# 选择最后的最大点赞数和最小笔记数量
result = max(include, exclude, key=lambda x: (x[0], -x[1]))
return result
max_likes, min_notes = max_likes_without_consecutive(notes)
print(max_likes, min_notes)
倒卖战利品
在游戏中,击败魔物后,薯队长获得了N件宝物,接下来得把这些宝物卖给宝物回收员来赚点小钱。这个回收员有个坏毛病,每次卖给他一件宝 物后,之后他就看不上比这件宝物差的宝物了。在这个世界中,衡量宝物的好坏有两个维度,稀有度X和实用度H,回收员在回收一个宝物A 后,下一个宝物的稀有度和实用度都不能低于宝物A。那么薯队长如何制定售卖顺序,才能卖给回收员宝物总个数最多。
def find_position_to_replace(sub, x):
"""手动实现二分查找,找到x应该被插入的位置"""
start, end = 0, len(sub) - 1
while start <= end:
mid = (start + end) // 2
if sub[mid] < x:
start = mid + 1
else:
end = mid - 1
return start
def lengthOfLIS(pairs):
pairs.sort(key=lambda x: (x[0], x[1])) # 按x升序,x相同则按y升序排序
sub = [] # 用于存储最长递增子序列的最后一个元素
for _, y in pairs:
pos = find_position_to_replace(sub, y) # 手动找到y应该被插入的位置
if pos == len(sub):
sub.append(y) # 如果y是当前最大的元素,直接添加到sub的末尾
else:
sub[pos] = y # 否则,替换在sub中找到的位置的元素
return len(sub)
# 示例输入
n = int(input()) # 读取点对数量
pairs = [tuple(map(int, input().split())) for _ in range(n)] # 读取点对
# 输出最长递增子序列的长度
print(lengthOfLIS(pairs))