9月9日360 算法笔试

第一题

给定一个一维数组表示不同地方的高度,然后在一个地方倒水。倒水会使得相邻的低于此地高度的地方积水。问最多多少个地方积水。

第二题

有一个长度为n的棋子队列,初始情况为全正面。对其做q次操作,每次操作会将[a,b]区域内的棋子翻转。问每次操作过后的正面棋子个数。

解法

一开始想维持一个线段队列,然后记录每个队列的正反情况。但是发现在插入新的线段时,要考虑的情况太多了:新线段包含已有线段,新线段和其中一个相交等等。
所以新的想法就是每次就将线段的两端记录下来,每次遇到一端就翻转。统计正反的棋子个数。

n, q = [int(x) for x in input().split()]
lines = [0, n]
for _ in range(q):
    a, b = [int(x) for x in input().split()]
    lines.append(a-1)
    lines.append(b)
    lines = sorted(lines)
    c = 1
    dic = {0:0, 1:0}
    prev  = 0
    for i in lines[1:]:
        cur = int(i)
        dic[c] += cur - prev 
        c = 1 - c 
        prev = cur
    print(dic[1])
#360笔试#
全部评论
第二题AC了吗?
点赞 回复 分享
发布于 2022-09-09 17:38 北京
大佬第二题思路牛逼,怎么想到的我等凡人只能想到开个数组暴力
点赞 回复 分享
发布于 2022-09-09 17:44 浙江
大佬,第二题的思路不是很明白,能麻烦您详细讲一下吗?为什么dic[c] += cur - prev就可以记录答案呢?c代表的是什么呢?
点赞 回复 分享
发布于 2022-09-09 18:17 湖北

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
点赞 评论 收藏
分享
2 6 评论
分享
牛客网
牛客企业服务