B3691 [语言月赛202212] 狠狠地切割(Easy Version) python实现

本题大多数都使用二分来做,pyhton实现时,用二分最后三个点出现超时,可能是有一部分代码未优化,先放出二分代码供参考学习。

# 读入数据
n, m = map(int, input().split())

numberA = list(map(int, input().split()))
numberB = list(map(int, input().split()))

numberB.sort()

# 标记切割点
states = [False] * n

ans = 0
# 遍历A列表  在B中查找当前的数是否为分割点
for i in range(n):
    left = 0
    right = m - 1
    while left < right:
        mid = (left + right) // 2
        if numberA[i] <= numberB[mid]:
            right = mid
        else:
            left = mid + 1
    if numberB[left] == numberA[i]:
        states[i] = True

# 标记完成后进行处理
# 按照线段个数进行处理
# 成为分割后线段的条件
#     本身没有被切割, 上一节点被切割了 或 是开头

for i in range(n):
    if not states[i] and (0 == i or states[i - 1]):
        ans += 1
print(ans)

二分算法,在最后三个测试数据出现超时,下面为优化版本   空间换时间

用数组标记排序后的分割点,遍历需要分割的片段,标记分割点

n, m = map(int, input().split())

numberA = list(map(int, input().split()))
numberB = list(map(int, in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值