題目鏈結: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...