約瑟夫問題

2022-10-11 14:45:15 字數 1070 閱讀 1116

基本問題

n個人排隊,從第乙個人報數,編號0--n-1,報第m的人退出,下乙個人當第乙個報數的人,求最後誰是贏家

f[i]表示i個人最後的贏家

f[1]=0

當我已經知道q個人的贏家是誰了

q+1個人玩遊戲,c=(m-1)%q號玩家被出局,m%q號玩家相當於q個人的贏家的居面,只是第乙個人編號變了,順次往下推(f[q]=x)個人

編號是(f[q]+m)%q

遞推求解即可

變形n個人坐成一圈玩遊戲。一開始我們把所有玩家按順時針從1到n編號。首先第一回合是玩家1作為莊家。每個回合莊家都會隨機(即按相等的概率)從卡牌堆裡選擇一張卡片,假設卡片上的數字為x,則莊家首先把卡片上的數字向所有玩家展示,然後按順時針從莊家位置數第x個人將被處決即退出遊戲。然後卡片將會被放回卡牌堆裡並重新洗牌。被處決的人按順時針的下乙個人將會作為下一輪的莊家。那麼經過n-1輪後最後只會剩下乙個人,即為本次遊戲的勝者。現在你預先知道了總共有m張卡片,也知道每張卡片上的數字。現在你需要確定每個玩家勝出的概率。

這裡有乙個簡單的例子:

例如一共有4個玩家,有四張卡片分別寫著3,4,5,6.

輸入格式

第一行包括兩個整數n,m分別表示玩家個數和卡牌總數。

接下來一行是包含m個整數,分別給出每張卡片上寫的數字。

輸出格式

輸出一行包含n個百分比形式給出的實數,四捨五入到兩位小數。分別給出從玩家1到玩家n的勝出概率,每個概率之間用空格隔開,最後不要有空格。

dp解決,因為模數不確定,每個模數都有可能做貢獻

const int n=1100;

double f[60][60];//在i個人形成的環環中,第j個人獲勝的概率

int n,m;

int c[60];

int main()

f[1][1]=1;

_f(i,2,n)//i個人環

} } _f(i,1,n-1)

double x=f[n][n];

x=x*100;

chu("%.2lf",x);

putchar('%');

return 0;

}

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫問題

這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...