1. 問題描述
疫情期間,一定要避免人群聚集,請用電腦程式來模擬: 長100公尺的跑道上有m個人, 有的面朝左,有的面朝右。每個人都只能沿著跑道走,速度是1m/秒。當兩個人碰面時,他們會同時掉頭往相反的方向走。這些人中, 有1個人感染了新型冠狀病毒。並且在和其它人碰面時,會把冠狀病毒傳染給碰到的人。請你計算,當所有人都離開跑道時,有多少人感染了新型冠狀病毒。
【輸入格式】第一行輸入乙個整數m(1【輸出格式】輸出為乙個整數,代表最後感染了新冠病毒的人數。
【輸入樣列】
5
-10 8 -2- 12 25
【輸出樣列】
32. **實現原理講解
確定總人數、初始位置、這個人是否生病
確定離開的感染人數(初始值為0)
確定仍然留在跑道上的人數(初始值為總人數)
確定迴圈終止的條件
若感染人數大於等於總人數或者留在跑道上的人數只有1個時程式終止
計算當前跑道上最近兩個人之間的距離,確定下一次可能有人碰面的時間和每個人移動距離
5.1 獲取初始位置值的絕對值
5.2 把當前位置的值(絕對值)從小到大排列
5.3 構造位置的交叉列表
5.4 刪除最後乙個變數
5.5 通過兩個列表相減算距離
5.6 求出最小的距離(不要列表中的第乙個值)
根據5的結果算出每個人將移動的距離, 並更新每個人的位置
判斷兩端是否有人成功走出
如果有人走出,判斷這個人是否感染,如果感染則離開的感染人數加1
刪掉成功走出的人,更新感染人數和 is_sick 列表
判斷是否有兩個人碰面了
如果有, 判斷是否有人感染, 有人感染則更新is_sick表(只要有乙個人感染則兩個人都會患病),碰面的兩個人調頭
判斷跑道上的人數是否等於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個時程式終止
while1:
#獲取初始位置值的絕對值
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_label_0 = start_position.index(i)
elif i<0:
if move_distince + i >=0:
out_label_0 = start_position.index(i)
elif i ==
0or i ==
100:
out_label_0 = start_position.index(i)
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()
iflen
(abs_new_position)
>
len(abs_new_position_set)
:for i in abs_new_position:
if abs_new_position.count(i)
>=2:
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 +=
1break
結果
python 用解決約瑟夫問題
coding utf 8 created on 2017年8月8日 author administrator 用python實現迴圈鍊錶,解決約瑟夫問題 class person def init self,num,next none self.next next self.num num defc...
疫情之後,我打算用python買彩票!(一)
import random defdouble color red i for i in range 1 34 blue i for i in range 1 17 dc num int input 請輸入要購買多少注雙色球 print 您購買的雙色球是 while dc num 0 dc red ...
用Python解決x的n次方問題
我考慮到了x的所有n次的情況,下面的 有可能是不完美的,但是肯定是對的。def aaa x,n a is程式設計客棧instance x,int,float 這是考慮x和n的型別,需要滿足條件才可以 if a true 往下執行 return none b isinstance n,int,floa...