赛码网算法: 军训队列( python实现 )
生活随笔
收集整理的這篇文章主要介紹了
赛码网算法: 军训队列( python实现 )
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
軍訓(xùn)隊(duì)列
題目描述
某大學(xué)開學(xué)進(jìn)行軍訓(xùn)隊(duì)列訓(xùn)練,將學(xué)生從一開始按順序依次編號,并排成一行橫隊(duì),訓(xùn)練的規(guī)則如下:從頭開始一至二報(bào)數(shù),凡報(bào)到二的出列剩下的依次向前靠攏,再從頭開始進(jìn)行一至三報(bào)數(shù),凡報(bào)到三的出列,剩下的依次向前靠攏,繼續(xù)從頭開始進(jìn)行一至二報(bào)數(shù)。。。以后每次從頭開始輪流進(jìn)行一至二報(bào)數(shù)、一至三報(bào)數(shù)直到剩下的人數(shù)不超過三人為止。
輸入
第一行為組數(shù)N,接著為N行學(xué)生人數(shù),學(xué)生人數(shù)不超過5000。
樣例輸入
2
20
40
輸出
輸出有N行,分別對應(yīng)輸入的學(xué)生人數(shù),每行輸出剩下的學(xué)生最初的編號,編號之間有一個空格。
樣例輸出
1 7 19
1 19 37
時間限制
C/C++語言:1000MS其它語言:3000MS
內(nèi)存限制
C/C++語言:65536KB其它語言:589824KB
試題地址:http://exercise.acmcoder.com/online/online_judge_list_all
在賽碼網(wǎng)上做算法題,遇到這樣一道題。
我的能力雖然一般,還需要繼續(xù)努力才能進(jìn)步。
但是希望記錄下來學(xué)會一道題的想法,可以提供給一些沒有思路的朋友們一個參考!
代碼捉襟見肘,還請見諒~
這是一道動態(tài)規(guī)劃的題。
動態(tài)規(guī)劃大致的思路就是:
把一個龐大的問題每次只完成一小步,每次都得到一個階段的結(jié)果,然后用這個結(jié)果去當(dāng)作下一階段的開始狀態(tài)。
并且每一步都是一個決策,不會影響接下來階段的決策,每個階段是獨(dú)立的。
我的思路是:
1 根據(jù)輸入人數(shù)m,初始化一個數(shù)組list,下標(biāo)從0到m-1號依次存入1到m號,表示他們的編號
2 開啟一個新的隊(duì)列res,對list進(jìn)行1至2報(bào)數(shù):
把list所有報(bào)1的位置里面的值依次入隊(duì)列res,一直到list遍歷結(jié)束
執(zhí)行3:對res 進(jìn)行1至3報(bào)數(shù)
3 對res進(jìn)行1至3報(bào)數(shù):
開啟一個隊(duì)列res2
把所有喊1和2的位置的元素依次入隊(duì)列到res2中 一直到res隊(duì)列遍歷結(jié)束
執(zhí)行2:在對res2進(jìn)行1至2報(bào)數(shù)
。。。。
最終,當(dāng)結(jié)果隊(duì)列里面少于三個元素時候,結(jié)束,得到了結(jié)果!
我是用python3來實(shí)現(xiàn)的:
1 # coding:utf8 2 #list是當(dāng)前隊(duì)列里按順序排號的編號,step是本次要執(zhí)行1到幾報(bào)數(shù) 3 def result(list, step): 4 if len(list) <= 3: #如果不多于3人,則應(yīng)該返回結(jié)果 5 return list 6 res = [] #用于存儲結(jié)果 7 if step == 2: #如果是1到2報(bào)數(shù) 8 res = list[::2] # 把list里的所有報(bào)2的人踢出去,剩下1 的人存給新列表res 9 return result(res, 3) #遞歸調(diào)用:再對res進(jìn)行1到3報(bào)數(shù) 10 else: #否則 當(dāng)前是1到3報(bào)數(shù) 11 cur = 0 #臨時變量 表示當(dāng)前所在0號位置 我們進(jìn)行向下遍歷操作 12 while cur < len(list): #如果當(dāng)前還沒到隊(duì)尾 13 res.append(list[cur]) #把當(dāng)前這個人放到res里 14 if cur + 1 < len(list): 15 res.append(list[cur + 1]) #把這個人的下一個人也放res里 16 cur += 3 #cur向后移動3人的位置 17 #跳出循環(huán)后,我們把報(bào)1和2 的人都放進(jìn)了res,在對res進(jìn)行1到2報(bào)數(shù) 18 return result(res, 2) 19 #這樣一直遞歸調(diào)用,每次都新開一個res來存留下來的人,一直到res里小于等于3個人的時候就是結(jié)果。 20 21 22 def main(): 23 n = int(input()) #接收測試用例數(shù) 24 for i in range(n): #每一次測試用例都做的 25 m = int(input()) #接收一個隊(duì)列人數(shù) 26 list = [j for j in range(1, m + 1)] #一個列表,從0到m-2 每個位置里面存了人的編號1到m 27 #調(diào)用方法得到列表,把列表轉(zhuǎn)換成符合題目要求的字符串 28 res = str(result(list, 2)).lstrip("[").rstrip("]").replace(",", " ") 29 print(res) 30 31 32 if __name__ == '__main__': 33 main()
題目描述
某大學(xué)開學(xué)進(jìn)行軍訓(xùn)隊(duì)列訓(xùn)練,將學(xué)生從一開始按順序依次編號,并排成一行橫隊(duì),訓(xùn)練的規(guī)則如下:從頭開始一至二報(bào)數(shù),凡報(bào)到二的出列剩下的依次向前靠攏,再從頭開始進(jìn)行一至三報(bào)數(shù),凡報(bào)到三的出列,剩下的依次向前靠攏,繼續(xù)從頭開始進(jìn)行一至二報(bào)數(shù)。。。以后每次從頭開始輪流進(jìn)行一至二報(bào)數(shù)、一至三報(bào)數(shù)直到剩下的人數(shù)不超過三人為止。
輸入
第一行為組數(shù)N,接著為N行學(xué)生人數(shù),學(xué)生人數(shù)不超過5000。
樣例輸入
2
20
40
輸出
輸出有N行,分別對應(yīng)輸入的學(xué)生人數(shù),每行輸出剩下的學(xué)生最初的編號,編號之間有一個空格。
樣例輸出
1 7 19
1 19 37
時間限制
C/C++語言:1000MS其它語言:3000MS
內(nèi)存限制
C/C++語言:65536KB其它語言:589824KB
試題地址:http://exercise.acmcoder.com/online/online_judge_list_all
在賽碼網(wǎng)上做算法題,遇到這樣一道題。
我的能力雖然一般,還需要繼續(xù)努力才能進(jìn)步。
但是希望記錄下來學(xué)會一道題的想法,可以提供給一些沒有思路的朋友們一個參考!
代碼捉襟見肘,還請見諒~
這是一道動態(tài)規(guī)劃的題。
動態(tài)規(guī)劃大致的思路就是:
把一個龐大的問題每次只完成一小步,每次都得到一個階段的結(jié)果,然后用這個結(jié)果去當(dāng)作下一階段的開始狀態(tài)。
并且每一步都是一個決策,不會影響接下來階段的決策,每個階段是獨(dú)立的。
我的思路是:
1 根據(jù)輸入人數(shù)m,初始化一個數(shù)組list,下標(biāo)從0到m-1號依次存入1到m號,表示他們的編號
2 開啟一個新的隊(duì)列res,對list進(jìn)行1至2報(bào)數(shù):
把list所有報(bào)1的位置里面的值依次入隊(duì)列res,一直到list遍歷結(jié)束
執(zhí)行3:對res 進(jìn)行1至3報(bào)數(shù)
3 對res進(jìn)行1至3報(bào)數(shù):
開啟一個隊(duì)列res2
把所有喊1和2的位置的元素依次入隊(duì)列到res2中 一直到res隊(duì)列遍歷結(jié)束
執(zhí)行2:在對res2進(jìn)行1至2報(bào)數(shù)
。。。。
最終,當(dāng)結(jié)果隊(duì)列里面少于三個元素時候,結(jié)束,得到了結(jié)果!
我是用python3來實(shí)現(xiàn)的:
1 # coding:utf8 2 #list是當(dāng)前隊(duì)列里按順序排號的編號,step是本次要執(zhí)行1到幾報(bào)數(shù) 3 def result(list, step): 4 if len(list) <= 3: #如果不多于3人,則應(yīng)該返回結(jié)果 5 return list 6 res = [] #用于存儲結(jié)果 7 if step == 2: #如果是1到2報(bào)數(shù) 8 res = list[::2] # 把list里的所有報(bào)2的人踢出去,剩下1 的人存給新列表res 9 return result(res, 3) #遞歸調(diào)用:再對res進(jìn)行1到3報(bào)數(shù) 10 else: #否則 當(dāng)前是1到3報(bào)數(shù) 11 cur = 0 #臨時變量 表示當(dāng)前所在0號位置 我們進(jìn)行向下遍歷操作 12 while cur < len(list): #如果當(dāng)前還沒到隊(duì)尾 13 res.append(list[cur]) #把當(dāng)前這個人放到res里 14 if cur + 1 < len(list): 15 res.append(list[cur + 1]) #把這個人的下一個人也放res里 16 cur += 3 #cur向后移動3人的位置 17 #跳出循環(huán)后,我們把報(bào)1和2 的人都放進(jìn)了res,在對res進(jìn)行1到2報(bào)數(shù) 18 return result(res, 2) 19 #這樣一直遞歸調(diào)用,每次都新開一個res來存留下來的人,一直到res里小于等于3個人的時候就是結(jié)果。 20 21 22 def main(): 23 n = int(input()) #接收測試用例數(shù) 24 for i in range(n): #每一次測試用例都做的 25 m = int(input()) #接收一個隊(duì)列人數(shù) 26 list = [j for j in range(1, m + 1)] #一個列表,從0到m-2 每個位置里面存了人的編號1到m 27 #調(diào)用方法得到列表,把列表轉(zhuǎn)換成符合題目要求的字符串 28 res = str(result(list, 2)).lstrip("[").rstrip("]").replace(",", " ") 29 print(res) 30 31 32 if __name__ == '__main__': 33 main()
?
轉(zhuǎn)載于:https://www.cnblogs.com/Lin-Yi/p/7338825.html
總結(jié)
以上是生活随笔為你收集整理的赛码网算法: 军训队列( python实现 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS图像绘制之:条纹背景(转)
- 下一篇: websocket python爬虫_p