/* 功能function description: 約瑟夫環+列舉 poj-1012
開發環境environment: dev c++ 4.9.9.1
技術特點technique:
版本version:
作者author: 可笑痴狂
日期date: 20120731
備註notes:
大致題意:
有k個壞人k個好人坐成一圈,前k個為好人(編號1~k),後k個為壞人(編號k+1~2k)
現在有乙個報數m,從編號為1的人開始報數,報到m的人就要自動死去。
問當m為什麼值時,可以使得在出現好人死亡之前,k個壞人先全部死掉?
ps:當前一輪第m個人死去後,下一輪的編號為1的人 為 前一輪編號為m+1的人
前一輪恰好是最後乙個人死掉,則下一輪迴圈回到開頭那個人報「1」
*//*
//**一:用順序表實現---列舉( 超時tle)
#include#includeint main()
; while(scanf("%d",&k),k)
printf("%d\n",joseph[k]);
return 0;}*/
//**三:用數學方法遞推
//出處:
/*遞推公式為:
ans[i]; //第i輪殺掉 對應當前輪的編號為ans[i]的人
ans[0]=0;
ans[i]=(ans[i-1]+m-1)%(n-i+1); (i>1 , 總人數n=2k 則n-i為第i輪剩餘的人數)
*///memory time
//184k 250ms
#includeusing namespace std;
int main(void)
; //打表,儲存各個k值對應的m值
int k;
while(cin>>k)
int n=2*k; //總人數
int ans[30]=; //第i輪殺掉 對應當前輪的編號為ans[i]的人
//ps:每一輪都以報數為「1」的人開始重新編號
int m=1; //所求的最少的報數
for(int i=1;i<=k;i++) //輪數
}joseph[k]=m;
cout<} return 0;
}
POJ 1012 約瑟夫問題
我是直接模擬的,因為實在想不到什麼好辦法,不過看到0 俗話說得好,不管黑貓白貓,抓到老鼠的就是好貓。於是在自家電腦模擬,打個表,就ac了。至於還有沒有其他方法,有待研究,大家有什麼好方法,請賜教,謝謝!1 模擬 方法是,m從2開始判斷,在1,2,3,2k中,每次找到第m個數,判斷如果是大於k的,那麼...
poj 1012 約瑟夫置換
一開始用的不是約瑟夫置換 關鍵是要儲存之前求出的值。因為只有13個數,所以也可以另開程式手動求出所有k值塞進陣列,這樣每次查詢都是o 1 0ms了 首先m值必須在 k 1 2kn,2k n 1 n 0,1,2 之間,然後 列舉。include include include include incl...
POJ 1012 約瑟夫環
poj的約瑟夫環問題是原本約瑟夫環的一種變形。約瑟夫環 有n個人,從第乙個人開始報數,數到第m個人就退出,依次迴圈,最後剩下的人為勝利者。可以用迴圈鍊錶和陣列的方法做,當m,n比較小時可以一試 迴圈鍊錶,數到就刪除,數到只剩乙個就輸出 陣列,第0個位置數值置為n,其他照常 a 1 1,a 2 2.數...