圓桌問題(用vector模擬約瑟夫環)

2021-10-02 09:18:56 字數 1381 閱讀 3954

題目鏈結:hdu 4841 圓桌問題

先看乙個小故事:

約瑟夫環問題是由古羅馬的史學家約瑟夫(josephus)提出的,他參加並記錄了公元66—70年猶太人反抗羅馬的起義。約瑟夫作為乙個將軍,設法守住了裘達伯特城達47天之久,在城市淪陷之後,他和40名死硬的將士在附近的乙個洞穴中避難。在那裡,這些叛亂者表決說「要投降毋寧死」。於是,約瑟夫建議每個人輪流殺死他旁邊的人,而這個順序是由抽籤決定的。約瑟夫有預謀地抓到了最後一簽,而且,作為洞穴中的兩個倖存者之一,他說服了他原來的犧牲品一起投降了羅馬。

下面這題就是乙個約瑟夫問題,用vector模擬動態變化的圓桌,趕走n個人之後留下的都是好人

圓桌問題

problem description

圓桌上圍坐著2n個人。其中n個人是好人,另外n個人是壞人。如果從第乙個人開始數數,數到第m個人,則立即處死該人;然後從被處死的人之後開始數數,再將數到的第m個人處死……依此方法不斷處死圍坐在圓桌上的人。試問預先應如何安排這些好人與壞人的座位,能使得在處死n個人之後,圓桌上圍坐的剩餘的n個人全是好人。

input

多組資料,每組資料輸入:好人和壞人的人數n(<=32767)、步長m(<=32767);

output

對於每一組資料,輸出2n個大寫字母,『g』表示好人,『b』表示壞人,50個字母為一行,不允許出現空白字元。相鄰資料間留有一空行。

sample input

2 32 4sample output

gbbg

bggb

解題思路:使用vector動態陣列方法通過取餘,刪除壞人,雖然效率有些低(因為每次刪除乙個人,所有人會往前移或者往後移,複雜度為o(n)),但容易操作

#include

using

namespace std;

intmain()

int loc =0;

//記錄當前位置

for(

int i=

0;i)int k=0;

//列印座位

for(

int i=

0;i<

2*n;i++)if

(ksize()

&& i==desk[k]

)else

cout<<

"b";

}//for

cout

}//while

return0;

}

藍橋杯模擬賽 報數遊戲 vector解決約瑟夫環

題 報數遊戲 有 n 1 n 10000 個小朋友站成乙個圓圈。選定乙個小朋友為1號,從他 她 開始順時針編號 1,2,3,4,遊戲開始 從1號小朋友起,順時針報數,從1報起。即 1號小朋友報1,2號小朋友報2,3號小朋友報3,遊戲規定,報到數字 m 1 m 100 的小朋友立即退出報數圈。在他 她...

約瑟環問題(丟手絹)

題目 n個人圍成一圈,起始編號為0 n 1。從0開始依次報數,報到m則離開圓圈。問最後離開的人的編號多少?分析 以每個人離開作為乙個週期,下一次假設所有人編號變化 其實是對映到 新的編號0 n 2。這裡的對映關係可以通過取模獲得 每次離開乙個人,離開前總人數n,m 1的人離開,那麼下次編號和上次編號...

list的用法 約瑟王問題

n個猴子圍圈報數,報道m的猴子退出剩下的重新報數。include include include include include include pragma warning disable 4996 using namespace std include include include inclu...