大家好,我是酷叮貓少兒編程的郭老師,今天我為大家帶了一道NOIP的算答題。
請看下題:
n個人站成一圈(n<20),逆時針編號為1~n.有兩個官員,A從0逆時針數,B從n開始順時針數.在每一輪中,官員A數k個就停下來,官員B數m個就停下來(注意有可能兩個官員在同一個人上)。接下來被官員選中的人(1或2人)離開隊伍.
輸入n,k,m輸出每輪裡被選中的人的編號(如果有兩個人,先輸出被A選中的)。
例如,n=10,k=4,m=3
輸出為4 8,9 5,3 1,2 6,10,7.注意:每輪輸出的數應當恰好佔3列.
[樣例運行結果如圖]
![Python教程——NOIP的算答題-救濟金髮放順序](http://p2.ttnews.xyz/loading.gif)
[代碼]
def go(nlist, p, d, t):
# p from 0 to leng-1
# d = 1 or -1
np = p
leng = len(nlist)
idlist =[]
for _ in range(t):
while True:
if nlist[np]>0:
idlist.append(np)
break
else:
np = (np + d + leng) % leng # np 遞增或遞減, 並循環
np = (np + d + leng) % leng
return idlist[-1]
def main():
ans=[]
nkm = input("Please input n k m:")
nkm = [x.strip() for x in nkm.split()]
while True:
try:
n,k,m = [int(x) for x in nkm]
break
except:
print("Try again: input n k m:")
nlist = list(range(1,n+1))
left = n
pa = 0 #A官員的逆時針起點
pb = n-1 #B官員的順時針起點
while left:
pa = go(nlist, pa, 1, k)
pb = go(nlist, pb, -1, m)
if pa==pb:
print("{}".format(nlist[pa]), end="")
nlist[pa]=0
left-=1
else:
print("{} {}".format(nlist[pa], nlist[pb]), end="")
nlist[pa], nlist[pb] = 0,0
left -= 2
if left>0:
print(",", end="")
print()
# print(nlist)
if __name__=="__main__":
main()
好的,就到這裡吧。如果大家有什麼不太明白的地方,留言喲. 下次見。Bye!
閱讀更多 酷叮貓少兒編程 的文章