小红书2020校招算法笔试题卷三

笔记草稿

薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
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))

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰米的大鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值