小明和同学们玩跳房子的游戏,现给出一排房子,请计算出小明最少需要跳几次就可戏,完成游戏时哪只脚落地?(0代表左脚,1代表右脚)
游戏规则1:地上画有n个正方形依次排开代表房子,每个房子里标有数字,数字代表最多可以跳几个房子,数字不能为0(如:数字为2,可以直接向前跳1个房子,也可以直接向前跳2个房子)。
例如:
地上画有5个正方形代表房子,房子里面的数字分别为2,1,4,2,1。
小明在第一个房子是可以选择跳到第2个房子或者第3个房子,为了所跳次数最少选择跳到第3个房子(房子数字为4);房间数字为4,可以选择跳到第4个房子或者第5个房子,为了所跳次数最少选择跳到第5个房子。故至少需要跳两次就可以完成游戏。
游戏规则2:只能单脚落地,左脚起跳右脚落地,右脚起跳左脚落地;第一次起跳为左脚
例如:
小明一共跳两次,第一次左脚起跳,右脚落地;第二次右脚起跳,左脚落地;完成游戏时左脚落地输入描述
第一行输入n个正整数,正整数之间用英文逗号隔开输出描述
输出两个整数,整数之间用英文逗号隔开;第一个整数表示最少跳的次数,第二个整数表示落地的脚(0代表左脚,1代表右脚)
这道题原题来自>悦儿姐的博文
我感觉她的算法还不够完美,不能得到正确答案,所以进行了一些小修改
思路
原博文谈到,左右脚的落地可以通过计数器的奇偶性来判断,这也很大程度给了我启发!
我的算法采用倒推的方式:
例如:
2 9 1 1 1 1 1 1 1 1 => 1 1 1 1 1 1 1 1 9 2
i = 0,找到能够走到 i 处的最远的那个格子,也就是 9 ,然后再循环这个操作,直到走完。
例如:
4 4 6 1 5 1 5 6 1 2 7 8 1 2 6 11 5 => 5 11 6 2 1 8 7 2 1 6 5 1 5 1 6 4 4
i = 0,找到能够走到 i 处的最远的那个格子,也就是 7 ,再循环操作,接下来就是 5 ,然后是 6 ,最后就是第一格4。
这道题的数字其实不是越大越好,而是越巧越好,一样可以走到 i 的,走的格子越多越好!
lists = list(map(int, input().strip().split(',')))[::-1] # 接收,顺便翻转
i = 0
count = 0
guochen = [] # 方便查看跳房子的过程
while i != len(lists) - 1:
y = i
for j in range(i + 1, len(lists)):
if lists[j] >= j - i:
y = j
count += 1
i = y
guochen.append(lists[i])
# print(guochen[::-1]) # 查看过程
print(count, 0 if count % 2 == 0 else 1)