題目地址:http://poj.org/problem?id=1012
問題描述:約瑟夫問題是這樣一個問題,N個人圍成一個圓圈,分別給每個人編號1,2,3,……,N。第一輪從1號人物開始報數,報到第M個人時,第M個人自殺,并退出圓圈;接著從自殺的這個人往后一個人開始從1繼續報數,報到M時,第M個人自殺;重復這一過程,直到只有最后一個人存活下來。
POJ1012中的這道題目對約瑟夫問題做了一些改動:
(1)限制了圈內的人數為2K,0<K<14
(2)認為前k個人為好人,后k個人為壞人,要求求得的M在殺死所有壞人前不準殺死一個好人。
基于以上理解,得到如下解題思路:
首先,針對第一輪,因為前k個人是好人,不能自殺,那么要求的M的值一定大于等于k;并且只需判斷前k個自殺的人是不是都在后k個位置
其次,針對每一輪,假設當前自殺的人為die,當前輪的總人數為currLen,那么下一輪自殺的人肯定是(die+M-1)%currLen;
在對當前M進行判斷時,只有當已經自殺的k個人不在前k個位置時,才是所求的M;否則,M加一,繼續求解。
在我的VS下,測試兩組數據,均得到正確結果。
提交代碼時,卻提示“Time Limit Exceeded”。仔細一看題目,原來有時間限制——Time Limit:1000MS
為了解決這個問題,不防先把計算出的k=1,2,3,……,13時的M值保存到數組中。
修改之后的代碼為: