9.13 百度 算法岗笔试 1.最大通关数 2.玩具士兵

Q1 100%

题意

小昱购买了两款游戏,第一款游戏***有n个关卡,通过第i关需要花ai的时间;第二款游戏***有m个关卡,通过第i关需要花bi的时间。两款游戏都不允许跳过关卡,即必须要通过第i关,才能挑战第i+1关。小昱想知道在游戏时长不超过t的情况下,最多可以通过多少关?

输入

第一行 n,m,t
第二行 ai数组
第三行 bi数组

思路

前缀和加枚举通过第一关的游戏数,更新答案。 具体实现可以写二分(见代码),注意到前缀和具有单调性所以也可以写双指针。

def solve():
    n, m, t = map(int, input().split())
    *a, = map(int, input().split())
    *b, = map(int, input().split())
    if n > m:
        n, m = m, n 
        a, b = b, a
    presum1 = [0] * (n + 1)
    presum2 = [0] * (m + 1)
    for i in range(1, n + 1):
        presum1[i] = presum1[i - 1] + a[i - 1]
    for i in range(1, m + 1):
        presum2[i] = presum2[i - 1] + b[i - 1]

    def find(target):
        l = 0
        r = m
        index = -1
        while l <= r:
            mid = (l + r) // 2
            if presum2[mid] <= target:
                index = mid 
                l = mid + 1
            else:
                r = mid - 1
        return index
    res = 0
    for i in range(n + 1):
        remain = t - presum1[i]
        if remain < 0:
            return res
        else:
            t2 = find(remain)
            if t2 + i > res:
                res = t2 + i 
    return res

print(solve())

Q2 100%

题意

小明买了一些玩具士兵,他邀请小红一起玩。他总共有n个士兵,刚开始时,这n个士兵被排成一列,第i个士兵的战斗力为hi。然后小明和小红开始给它们排序。二人总共进行了m次操作。小明的每次操作会选择一个数k,将前k个士兵按战斗力从小到大排序。小红的每次操作会选择一个数k,将前k个士兵按战斗力从大到小排序。请问所有操作结束后从前往后每个士兵的战斗力是多少?

输入

第一行 n, m
第二行 长度为n的数组
后m行 tmp, k (tmp 等于1 代表小明, tmp 等于2 代表小红)

思路

  • 注意到当后面的k大于等于前面的k时候,前面的操作变成无效操作
  • 如果是同一个人连续操作,那么后面的k小于前面的k时候,操作无效
  • 因此,先用单调栈找到有效操作 按照题意模拟即可 具体实现可以加哨兵优化 笔试的时候写的不是很优雅 应该有更优雅的写法
def solve():
    n, m = map(int, input().split())
    *nums, = map(int, input().split())
    stack = []
    for i in range(m):
        pid, k = map(int, input().split())
        while stack and k >= stack[-1][0]:
            stack.pop() 
        if stack and stack[-1][1] == pid:
            continue 
        stack.append([k, pid])
    res = nums[:]
    if stack:
        candidates = nums[:stack[0][0]]
        l = 0
        r = len(candidates) - 1
        candidates.sort()
        for i in range(len(stack) - 1):
            tmp = stack[i][0] - stack[i + 1][0]
            if stack[i][1] == 1:
                res[stack[i + 1][0]: stack[i][0]] = candidates[r - tmp + 1 : r + 1]
                r -= tmp
            else:
                res[stack[i + 1][0]: stack[i][0]] = candidates[l : l + tmp][::-1]
                l += tmp 
        if stack[-1][1] == 1:
            res[:stack[-1][0]] = candidates[l:r + 1]
        else:
            res[:stack[-1][0]] = candidates[l:r + 1][::-1]

    return " ".join(map(str, res))
print(solve())
#百度笔试##秋招笔试##笔试##百度23秋招笔试编程题有点儿简单啊#
全部评论
哈哈,第一次学会*a, =map这样的写法,谢谢大佬
5 回复 分享
发布于 2022-09-13 22:54 河北
和大佬思路一样,荣幸哈哈
1 回复 分享
发布于 2022-09-13 22:35 北京
大佬这个*nums, = map(int, input().split())是啥啊,没搜到,蹲指教。
点赞 回复 分享
发布于 2022-09-14 16:17 北京
好厉害..请问大佬刷了多少题啊 太强了
点赞 回复 分享
发布于 2022-09-13 23:57 湖南

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
评论
6
39
分享

创作者周榜

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