2013\National _C_C++_B\4.高僧斗法
古時(shí)喪葬活動中經(jīng)常請高僧做法事。儀式結(jié)束后,有時(shí)會有“高僧斗法”的趣味節(jié)目,以舒緩壓抑的氣氛。
節(jié)目大略步驟為:先用糧食(一般是稻米)在地上“畫”出若干級臺階(表示N級浮屠)。又有若干小和尚隨機(jī)地“站”在某個(gè)臺階上。最高一級臺階必須站人,其它任意。(如圖1所示)
兩位參加游戲的法師分別指揮某個(gè)小和尚向上走任意多級的臺階,但會被站在高級臺階上的小和尚阻擋,不能越過。兩個(gè)小和尚也不能站在同一臺階,也不能向低級臺階移動。
兩法師輪流發(fā)出指令,最后所有小和尚必然會都擠在高段臺階,再也不能向上移動。輪到哪個(gè)法師指揮時(shí)無法繼續(xù)移動,則游戲結(jié)束,該法師認(rèn)輸。
對于已知的臺階數(shù)和小和尚的分布位置,請你計(jì)算先發(fā)指令的法師該如何決策才能保證勝出。
輸入數(shù)據(jù)為一行用空格分開的N個(gè)整數(shù),表示小和尚的位置。臺階序號從1算起,所以最后一個(gè)小和尚的位置即是臺階的總數(shù)。(N<100, 臺階總數(shù)<1000)
輸出為一行用空格分開的兩個(gè)整數(shù): A B, 表示把A位置的小和尚移動到B位置。若有多個(gè)解,輸出A值較小的解,若無解則輸出-1。
例如:
用戶輸入:
1 5 9
則程序輸出:
1 4
再如:
用戶輸入:
1 5 8 10
則程序輸出:
1 3
尼姆博奕論
不清楚啥是尼姆游戲的可以先看一段視頻:
尼姆游戲(學(xué)霸就是這樣欺負(fù)人的)
這道題就是用的尼姆博弈,只要找到怎樣改變使可移動的臺階數(shù)之間異或相加之后結(jié)果為0就是必贏局面,如果沒有移動之前異或相加的值就是0,那么是必輸局面。
構(gòu)造nim模型為:從前到后每兩個(gè)為一組,之間的距離-1構(gòu)造為nim的一個(gè)堆。當(dāng)堆之間異或?yàn)?時(shí),輸出-1,即無必勝技巧;當(dāng)異或不為0時(shí),暴力破解找到最小移動和尚的那步然后輸出,此時(shí)注意移動一個(gè)和尚,當(dāng)前和尚與上面一個(gè)和尚的距離減少,與下面一個(gè)和尚距離增加。
Code
if __name__ == '__main__':t, n = 0, list(map(int, input().split()))length = len(n)sub = [0] * lengthfor k in range(0, length, 2):if k > 1:sub[k - 2] = n[k - 1] - n[k - 2] - 1if k % 2 == 0:t ^= sub[k - 2]if not t:print(-1)else:for i in range(length - 1):for j in range(1, n[i + 1] - n[i]):sub[i] -= jif i:sub[i - 1] += jt = 0for m in range(0, length - 1, 2):t ^= sub[m]if t == 0:print(f'{n[i]} {n[i] + j}')breaksub[i] += jif i:sub[i - 1] -= j不知道為啥,只能過兩個(gè)評測。
總結(jié)
以上是生活随笔為你收集整理的2013\National _C_C++_B\4.高僧斗法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 104. Maximum Depth o
- 下一篇: 科技公司预备持jiu战:谷歌将允许员工在