
疫情期间,一定要避免人群聚集,请用计算机程序来模拟: 长100米的跑道上有m个人, 有的面朝左,有的面朝右。每个人都只能沿着跑道走,速度是1m/秒。当两个人碰面时,他们会同时掉头往相反的方向走。这些人中, 有1个人感染了新型冠状病毒。并且在和其它人碰面时,会把冠状病毒传染给碰到的人。请你计算,当所有人都离开跑道时,有多少人感染了新型冠状病毒。
[输入格式]第一行输入一个整数m(1<m<25), 表示总人数。接着的一行是用空格分开的整数Ai (-100<Ai<100), Ai的绝对值表示人距离跑道左边端点的距离。大于零表示面向右, 小于零表示面向左, 数据中不允许出现0值, 也不允许出现两个人占用同一位置。其中,第一个数据代表的人已经携带病毒。
【输出格式】输出为一个整数,代表最后感染了新冠病毒的人数。
【输入样列】
2. 代码实现原理讲解
如果等于1, 先判断这个人是否感染, 如果是, 则离开的感染人数加1, 同时程序终止
如果大于1, 回到步骤5进行下一轮循环
3. Python程序实现
all_person_num = 5start_position = [-10, 8, -20, 12, 25]is_sick = [1, 0, 0, 0, 0]sick_num = 0 #给定初始离开的感染人数stay_person_num = all_person_num #给定留在跑道上的人数#若感染人数大于等于总人数或者留在跑道上的人数只有1个时程序终止while 1:#获取初始位置值的绝对值abs_start_position = [abs(i) for i in start_position]#把当前位置的值(绝对值)从小到大排列order_position = sorted(abs_start_position, key=abs)#构造交叉列表order_position_1 = [0] + order_position#删除最后一个变量by = order_position_1.pop()#算距离distince = [order_position[i] - order_position_1[i] for i in range(len(order_position_1))]by = distince.pop(0)order_distince = sorted(distince)w = 0#求出最小的距离(不要列表中的第一个值)while order_distince[w]==0:w += 1min_distince = order_distince[w]move_distince = min_distince/2#更新人的位置new_position = [a+move_distince for a in start_position]#判断两端是否有人成功走出out_num = list()out_label = list()for i in start_position:if i>0:if move_distince + i >= 100:out_num.append(i)out_label_0 = start_position.index(i)out_label.append(out_label_0)elif i<0:if move_distince + i >= 0:out_num.append(i)out_label_0 = start_position.index(i)out_label.append(out_label_0)elif i == 0 or i == 100:out_num.append(i)out_label_0 = start_position.index(i)out_label.append(out_label_0)else:pass#删掉成功走出的人,更新sick_num和is_sick列表for i in out_label:if is_sick[i]==1:sick_num += 1del is_sick[i]del new_position[i]stay_person_num -= 1#判断是否有两个人碰面了,如果有判断是否有人感染,有人感染则更新is_sick表abs_new_position = [abs(i) for i in new_position]abs_new_position_set = set(abs_new_position)#判断是否有两个人相遇more_2_num = list()if len(abs_new_position)>len(abs_new_position_set):for i in abs_new_position:if abs_new_position.count(i)>=2:more_2_num.append(i)more_2_num = set(more_2_num)#更新是否增加感染,确认调头for i in more_2_num:meet_1 = new_position.index(i)meet_2 = new_position.index(-i)#只要有一个人感染则两个人都会患病if is_sick[meet_1]==1 or is_sick[meet_2]==1:is_sick[meet_1]=1is_sick[meet_2]=1#碰面的两个人调头new_position[meet_1] = -new_position[meet_1]new_position[meet_2] = -new_position[meet_2]start_position = new_positionnew_position = list()if stay_person_num==1:if is_sick[0]==1:sick_num += 1break
结果
sick_num3
-end-
你可能感兴趣:

长按识别上方二维码学习更多Python知识
喜欢这篇文章
就请点个 “ 在看 ” 吧
原文作者:阿黎逸阳的代码;如有侵权,请联系管理员删除。