高原上有n个城镇,编号为1-n,它们在同一条道路上连接,每个城镇都有一个海拔高度h[i]米。小明的旅行从城市1开始,每天都从一个城镇移动到相邻的城镇,但是小明每天最多向高处移动x米,x也就是小明的体力值。也就是说:如果v,u相邻,如果h[u] -h[v] > x,那么小明无法从v移动到v,但可以从海拔高的地方走到海拔低的地方,即从u移动到v。现在小明带上朋友去,他有m个朋友,每个朋友都有一个体力值xi,小明希望找和他步调一致的朋友,如果他的朋友体力和小明差不多,那么他可以到达的城镇和小明完全一样。现在小明要找到符合这种情况的朋友的编号。
输入:
第一行三个整数,n,m,x表示高原上城市的个数,朋友个数和小明的体力值
第二行n个整数,表示编号从1到n的城市的海拔高度hi(1<=hi<=1000000000)
第三行m个整数,表示小明朋友的体力值
例:
n = 5
m = 5
x = 6
h = [5, 7, 6, 10, 9]
y = [1, 8, 2, 9, 1]
输出
[2, 4]
def max_len(h, y, x):
""""爬山的时候,下山不论体力多少都可以下去,我们只要考虑上山的时候,能够爬过的最高高度left_height,
以及首次不能爬过去的高度right_height
如果都能爬过去,则只要体力大于小明体力即可,否则,体力在left_height于right_height之间才可以步调一致"""
# 初始化爬过的上山的最高高度left_height,首次不能达到的高度right_height
left_height = -1
right_height = 0
for i in range(1, len(h)):
if h[i] - h[i - 1] <= x:
left_height = max(left_height, 0 if h[i] - h[i - 1] < 0 else h[i] - h[i - 1])
else:
right_height = h[i] - h[i - 1]
break
if not right_height: # 都是下山
print([i + 1 for i in range(len(y)) if y[i] > x])
else:
print([i + 1 for i in range(len(y)) if left_height <= y[i] < right_height])