毒蘑菇 最大体力
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)