用Python解決疫情相關問題

2021-10-03 18:01:20 字數 3986 閱讀 8997

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...