毒蘑菇 最大体力

location_bigger = [0]
m = 3 # 初始体力
N = 9 # 方块个数

A = [1, 2, -1, -2, -1, -2, 1, 1, 2]
#A = [1, 2, 1, 2, 1, 2, 1, 1, 2] # 每个方块上增加的体力值

# 查询出增加体力值 >=1 的位置
for i in range (0, N):
    if A[i] >= 1:
        location_bigger.append(i+1)
length_location_bigger = len(location_bigger)

A_sum = [m]
for j in range (1, length_location_bigger):
    X = A_sum[j-1]+A[location_bigger[j]-1]-(location_bigger[j]-location_bigger[j-1])
    A_sum.append(X)

sort_A_sum = A_sum.copy()
sort_A_sum.sort()
if sort_A_sum[0] <= 0:
    print('can not finish')
else:
    print(A_sum[-1])

题目:从起点开始接下来有 n 个方块,相邻方块间的距离都为 1,每个方块上有增加体力的食用蘑菇或减少体力的毒蘑菇,蘑菇带来的体力改变是已知的。一个人初始体力为 m,每次可以往前跳任意个方块,体力耗尽就会死掉。每跳一次消耗的体力与跳的距离成正比,比例为 1。问这个人能否跳到终点,如果能,求可能剩余的最大体力。

1. 本人之前未接触过python,刚学了一周,故还有一大部分函数没有用过,只能用最基本的思路来解决这个问题,如果有哪位大哥可以更简单的解决问题,请留言但勿喷.
2. 一直以为算法工程师就是安心做算法,而且最好是博士期间算法的应用或者延申,但是目前面试结果来看,算法不重要,刷题才是根本.

题目困惑 1 . 就我个人来说,首先会考虑的是食用蘑菇增加多少体力,毒蘑菇减少多少体力,每次增加或减少的体力是否一样等等的问题(我刚看到这个题就是这么想的,因为本人读博期间只研究时间序列,单变量多变量,而且从没有接触过python,所以遇到这个问题,觉得很多数据都是未知的,如果直接给一个list肯定是更清晰的)。但在这个问题里,不要考虑这个,面试官只是把一个list用一系列的方块来描述了,而且每个方块上的值就是对应的list中的值(大于0即为食用蘑菇,小于0即为毒蘑菇)。
题目困惑 2 . 就这个问题而言,我们要考虑的是,在蹦之前就消耗掉了体力,还是吃掉蘑菇之后才消耗蹦那一下的体力。比如,这个人当前体力为 1,如果蹦之前就消耗体力,那么无论接下来怎样,都会在蹦那一瞬间死掉,这是一种分析方法;而如果是吃完蘑菇后消耗蹦那一下的体力,则是另一种分析方法。而在面试官的思路中,应当是吃掉蘑菇后再消耗之前蹦的体力,即后一种分析方法。

解题思路:
第一步:先举一个简单的例子,初始体力为 m,一个长度为 6 的方块(即长度为 6 的list):[1, 2, -1, 2, 3, 4],跳到第一个上面,当前体力为 m+1-1,再跳到第二个上面,体力为 m+1-1+2-1,那么可以得出,只要数字大于等于1,那么都应该往这个方块上跳。
第二步:这个人当前体力为m,离这个人目前位置最近的下一个 >=1 的数字(x)与这个人当前的距离(d),如果d>m+x,则无法到达终点,如果不存在这样的问题,则可以到达终点,最大的体力即所有大于等于1的数字相加,加上初始体力m,再减去方块数量n。因为面试官说是从地上跳上去的,所以跳到第一个上面也需要消耗一个体力,因为总木块数量为n,所以当到达终点时,一共消耗的体力为 n。

测试list1:[1, 2, -1, -2, -1, -2, 1, 1, 2], 初始体力 m<4 时,则不能到达终点,输出为-1;初始体力 m>=4 时,可以抵达终点,最终结果为 m-2
测试list2:[1, 2, 1, 2, 1, 2, 1, 1, 2], 最终结果为 (m+1+2+1+2+1+2+1+1+2-9 = m+4)
#字节跳动##笔试题目#
全部评论
```go func bMmxI9(nums []int, m int) (int, bool) { end := m for now := 0; now < len(nums) && now < end; now++ { if nums[now] > 0 { end += nums[now] } } return end - len(nums), end-len(nums) >= 0 } func main() { fmt.Println(bMmxI9([]int{1, 2, 1, 2, 1, 2, 1, 1, 2}, 3)) } ```
点赞 回复 分享
发布于 2022-11-09 16:04 陕西

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
6
5
分享

创作者周榜

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