题目描述
流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。发动机的启动方式分为“手动启动”和“关联启动”两种方式。
如果一个发动机被手动启动,下一个时刻与之相邻的两个发动机会被“关联启动”。
如果准备启动某个发动机时,它已经被启动了,则什么都不用做。
发动机0与发动机N-1是相邻。地球联合政府准备挑选某些发动机在某些时刻进行“手动启动”,最终所有的发动机都会被启动。需要找出哪些发动机最晚被启动。
输入描述
第一行两个数字N和E,中间有空格。
N代表部署发动机的总个数,E代表计划手动启动的发动机总个数。
1<N<=1000,1<=E<=1000,E<=N。
接下来共E行,每行都是两个数字T和P,中间有空格。
T代表发动机的手动启动时刻,P代表此发动机的位置编号。0<=T<=N,0<=P<=N。
输出描述
第一行一个数字N,以回车结束。
N代表最后被启动的发动机个数。
第二行N个数字,中间有空格,以回车结束。每个数字代表发动机的位置编号,从小到大排序。
用例
【用例一】
输入
8 2
0 0
1 7
输出
1
4
说明:8 个发动机,时刻 0 启动 0 号发动机,时刻 1 启动 7 号发动机。
Python代码实现
注意:为了方便调试,没有采用input()输入,直接用的给函数传参的方式,方便调试。
def main(n, e, nums: List):
# start_time数组,存储每个发动机启动的时刻
start_time = [1001 for _ in range(n)] # 初始化元素为1001,方便后面求启动的 最小值 时刻
for num in nums:
t = num[0]
p = num[1]
start_time[p] = min(t, start_time[p])
print(start_time)
# 循环每一时刻,因为n个机器,故最多时刻n可以启动完
for t in range(n):
# 遍历每台机器 启动的时刻
for i in range(n):
if start_time[i] == t:
# 更新相邻发动机的启动时间
# 这里有个小技巧,因为这个机器是环状排列的,上一个元素取 (i - 1) % n, 下一个元素取 (i + 1) % n
start_time[(i - 1) % n] = min(start_time[(i - 1) % n], t + 1) # 每个元素要取 最小的时刻
start_time[(i + 1) % n] = min(start_time[(i + 1) % n], t + 1)
print(start_time)
max_start_time = max(start_time)
last_engines = [i for i in range(n) if start_time[i] == max_start_time]
print(len(last_engines))
print(" ".join(map(str,last_engines)))
if __name__ == '__main__':
m, n = 8, 2
nums = [[0, 0], [1, 7]]
main(m, n, nums)