题解 | 小A的线段(easy version)

小A的线段(easy version)

https://www.nowcoder.com/practice/03950e31758643d2924601b6dd466c24

n, m = map(int, input().split())
edges = [list(map(int, input().split())) for _ in range(m)]

boundary = []
for i, e in enumerate(edges):
    boundary.append([e[0], 0, i])
    boundary.append([e[1], 1, i])

boundary.sort()

num = [[0, 0, 0, 0]]#边界起点,边界起点到下一个边界点的覆盖次数,边界点的出现在起始点、终止点的次数;因为边界终止点不计入覆盖次数
i = 0
for b in boundary:
    if b[1] == 0:
        if b[0] == num[i][0]:
            num[i][1] += 1
            num[i][2] += 1
        else:
            num.append([b[0], num[i][1]+1, 1, 0])
            i += 1
    else:
        if b[0] == num[i][0]:
            num[i][1] -= 1
            num[i][3] += 1
        else:
            num.append([b[0], num[i][1]-1, 0, 1])
            i += 1
# print(num)

# 回溯方法搜索所有可能的选择方式
def dfs(ind, n_r):# 此处默认输入的n_r一定是合理的
    if ind >= m:
        # print(n_r)
        return 1 #成功搜索完整个数组,没有中途中断,符合要求的一个解
    # 不删除edge[ind]
    # for i in range(1, len(n_r)-1):
    #     if n_r[i][1]<2:
    #         return 0 # 当前情况无法满足覆盖要求,后续不需要再搜索
    N = dfs(ind+1, [nu[:] for nu in n_r])
    # 删除edge[ind]
    e = edges[ind]
    for i in range(1, len(n_r)):
        if n_r[i][0]==e[0]:
            n_r[i][2] -= 1
        if n_r[i][0]==e[1]:
            n_r[i][3] -= 1
        if n_r[i][0]>=e[0] and n_r[i][0]<e[1]:#删除某条边上对计数的贡献
            n_r[i][1] -= 1
    for i in range(1, len(n_r)-1):#这里漏掉最后一个点判断,循环后补上
        if ((n_r[i][1]+n_r[i][3])<2) or (n_r[i][1]<2 and (n_r[i+1][0] - n_r[i][0])>2):
            # print(n_r)
            return N # 当前情况无法满足覆盖要求,后续不需要再搜索
    if n_r[-1][3] < 2:#补上最后一个点判断
        return N
    # print(n_r)
    N += dfs(ind+1, [nu[:] for nu in n_r])
    return N

# 判断当前的num是否满足要求
for i in range(1, len(num)-1):#这里漏掉最后一个点判断,循环后补上
    if ((num[i][1]+num[i][3])<2) or (num[i][1]<2 and (num[i+1][0] - num[i][0])>2):
        print(0)
        exit(0) # 当前情况无法满足覆盖要求,后续不需要再搜索
if num[-1][3] < 2:#补上最后一个点判断
    print(0)
    exit(0)
N = dfs(0, [nu[:] for nu in num])#二维数组num需要使用深拷贝,所以作了循环生成
# print(num)
print(N)

全部评论

相关推荐

xiaolihuam...:当然还有一种情况是你多次一面挂,并且挂的原因都比较类似,例如每次都是算法题写不出来。面试官给你的评价大概率是算法能力有待加强,算法能力有待提高,基础知识掌握的不错,项目过关,但是coding要加强。短期内高强度面试并且每次都是因为同样的原因挂(这个你自己肯定很清楚),会形成刻板印象,因为你偶尔一次算法写不出来,面试官自己也能理解,因为他清楚的知道自己出去面试也不一定每一次面试算法都能写出来。但是连续几次他发现你的面屏里面都是算法有问题,他就认为这不是运气问题,而是能力问题,这种就是很客观的评价形成了刻白印象,所以你要保证自己。至少不能连续几次面试犯同样的错。算法这个东西比较难保证,但是有些东西是可以的,例如某一轮你挂的时候是因为数据库的索引,这个知识点答的不好,那你就要把数据库整体系统性的复习,下一轮面试你可以,项目打的不好,可以消息队列答的不好,但是绝对不可以数据库再答的不好了。当然事实上对于任何面试都应该这样查漏补缺,只是对于字节来说这个格外重要,有些面试官真的会问之前面试官问过的问题
点赞 评论 收藏
分享
叁六玖:你看,最后不是让你加油,就是鼓励你,还祝福你求职顺利。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务