ITPub博客

首页 > 数据库 > 数据库开发技术 > 解决疫情相关问题

解决疫情相关问题

原创 数据库开发技术 作者:阿黎逸阳的代码 时间:2020-03-10 21:44:37 0 删除 编辑

1. 问题描述

疫情期间,一定要避免人群聚集,请用计算机程序来模拟: 长100米的跑道上有m个人,  有的面朝左,有的面朝右。每个人都只能沿着跑道走,速度是1m/秒。当两个人碰面时,他们会同时掉头往相反的方向走。这些人中, 有1个人感染了新型冠状病毒。并且在和其它人碰面时,会把冠状病毒传染给碰到的人。请你计算,当所有人都离开跑道时,有多少人感染了新型冠状病毒。


[输入格式]第一行输入一个整数m(1<m<25), 表示总人数。接着的一行是用空格分开的整数Ai (-100<Ai<100),  Ai的绝对值表示人距离跑道左边端点的距离。大于零表示面向右, 小于零表示面向左, 数据中不允许出现0值, 也不允许出现两个人占用同一位置。其中,第一个数据代表的人已经携带病毒。


【输出格式】输出为一个整数,代表最后感染了新冠病毒的人数。

【输入样列】

    5
    -10  8 -2- 12 25
【输出样列】
      3

2. 代码实现原理讲解

1. 确定总人数、初始位置、这个人是否生病
2. 确定离开的感染人数(初始值为0)
3. 确定仍然留在跑道上的人数(初始值为总人数)
4. 确定循环终止的条件
    若感染人数大于等于总人数或者留在跑道上的人数只有1个时程序终止
5. 计算当前跑道上最近两个人之间的距离,确定下一次可能有人碰面的时间和每个人移动距离
    5.1 获取初始位置值的绝对值
    5.2 把当前位置的值(绝对值)从小到大排列
    5.3 构造位置的交叉列表
    5.4 删除最后一个变量
    5.5 通过两个列表相减算距离
    5.6 求出最小的距离(不要列表中的第一个值)
6. 根据5的结果算出每个人将移动的距离, 并更新每个人的位置
7. 判断两端是否有人成功走出
    如果有人走出,判断这个人是否感染,如果感染则离开的感染人数加1
8. 删掉成功走出的人,更新感染人数和 is_sick 列表  
9. 判断是否有两个人碰面了
    如果有, 判断是否有人感染, 有人感染则更新is_sick表(只要有一个人感染则两个人都会患病),碰面的两个人调头
10. 判断跑道上的人数是否等于1

    如果等于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 += 1 min_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 += 1 del 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]=1 is_sick[meet_2]=1 #碰面的两个人调头 new_position[meet_1] = -new_position[meet_1] new_position[meet_2] = -new_position[meet_2]
start_position = new_position new_position = list() if stay_person_num==1: if is_sick[0]==1: sick_num += 1        break

结果

sick_num3


如果还有不理解的地方,可以加我微信进行咨询。



-end-



你可能感兴趣:

表白-白衣天使

风控建模整体流程

用python绘制皮卡丘

风控建模中的IV和WOE


长按识别上方二维码学习更多Python知识


喜欢这篇文章

就请点个 “ 在看 ” 吧



原文作者:阿黎逸阳的代码;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-02-15

  • 博文量
    282
  • 访问量
    130853