【发布时间】:2021-06-15 02:23:03
【问题描述】:
所以这是来自 HackerRank 网站的问题。我已经尽了最大努力,但我终其一生都无法弄清楚我做错了什么。问题如下:
“这是元旦,人们排队乘坐仙境过山车。每个人都戴着一个贴纸,表明他们在队列中的初始位置,从1到n。任何人都可以直接贿赂前面的人他们中的一些人交换了位置,但他们仍然戴着原来的贴纸。一个人最多可以贿赂另外两个人。
确定为达到给定队列顺序而发生的最低贿赂次数。打印贿赂的数量,或者,如果有人贿赂了两个以上的人,打印Too chaotic。”
这是我的尝试:
def minimumBribes(q):
bribes = 0
sorted_q = sorted(q)
total_moves = 0
for i in range(len(q)):
origin = sorted_q[i]
current = q[i]
moved = current - origin
if moved > 0:
if moved > 2:
print("Too chaotic")
return
else:
total_moves += moved
print(total_moves)
我意识到这有点罗嗦,但我想让我的逻辑尽可能清晰。
如果我输入q = [1,2,5,3,7,8,6,4],预期的输出是7,但我得到6
为什么!
【问题讨论】:
-
我刚刚看到有人已经在hackerrank new year chaos code optimization 中发布了这个问题的解决方案,但我更想知道为什么我的解决方案不起作用。
-
如果你手写这个,你会发现 6 也必须贿赂 4。它们不仅不合适,而且不正常 (6>4)。
-
所以你的意思是简单地拿当前位置和原位置之间的差,我错过了贿赂?
-
对。 6 和 4 不按顺序排列的事实意味着一定有贿赂,但我还没有想出量化的方法来确定这一点。
-
啊,我现在明白了。 5 右边有 2 个小数,7 右边有 2 个小数,8 右边有 2 个小数,6 右边有 1 个小数。那就是 7。跨度>