1. 程式人生 > >約瑟夫問題變形 And Then There was One, LA 3882 遞推 動態規劃

約瑟夫問題變形 And Then There was One, LA 3882 遞推 動態規劃

問題的大意是有n個數編號依次為1~n構成一個圈,第一次去掉編號為m的數字,以後沒數到k把該數字去掉,問最後剩下什麼數字。

此題的解法是動態規劃,遞推。標準的約瑟夫問題是0~n-1的n個數從零開始,每數到k就把該數字去掉,隨後剩下什麼數字。

我們可以將該題化為標準的約瑟夫問題。假設有n個數字的標準約瑟夫問題,編號為0~n-1,第一次去掉的數字是(k-1)%n,則剩下的數字是 k%n, k%n+1 n%k+2,...,n-1,,,,k%n-2

我們作如下轉換 設 k%n=a,則有 a,a+1,a+2,。。。,n-1,0,1,2,3,。。。,a-2。 a->0, a+1->1, a+2->2, a+3->3,..., a-2->n-2. 變換的公式是 f(x)=(x+k)%n則問題轉化成了規模為n-1的標準約瑟夫問題。由於問題的特殊性,本題在最後一次變化的時候是數到m因此在計算最後一次的時候,要把m賦值給k再計算。程式碼如下。

#include<iostream>
using namespace std;
#define MAXN 100001
int f[MAXN];
int main()
{
	int n,k,m;
	while(cin>>n>>k>>m)
	{
	   if(n==0&&k==0&&m==0)break;
            f[1]=0;
	    for(int i=2;i<=n-1;i++)
	    {
		    f[i]=(f[i-1]+k)%i;
	    }
	    f[n]=(f[n-1]+m)%n+1;
	    cout<<f[n]<<endl;
	}
}


相關推薦

問題變形 And Then There was One, LA 3882 動態規劃

問題的大意是有n個數編號依次為1~n構成一個圈,第一次去掉編號為m的數字,以後沒數到k把該數字去掉,問最後剩下什麼數字。 此題的解法是動態規劃,遞推。標準的約瑟夫問題是0~n-1的n個數從零開始,每數到k就把該數字去掉,隨後剩下什麼數字。 我們可以將該題化為標準的約瑟夫問

G - And Then There Was One環)

then star names rule this ret zeros datasets cell Description Let’s play a stone removing game. Initially, n stones are arranged on a ci

And Then There Was One環)(動態規劃

UVA - 1394 原題目連結 題目描述: Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, . . . , n clock

POJ - 3517 And Then There Was One環變式)

題目大意:       n個人,從第m個人開始報數,報到k的人出局,問最後剩餘的人是第幾號 題解:      本題和經典的約瑟夫環問題相比,就是從第m個人開始報數了,經典的是從第1個開始   &

And Then There Was One

題解: 1.約瑟夫環變形 2.倒著推: 最後剩一個人,如果把他編號為一號 然後推如果剩倆人,他是對應的幾號 然後如果三人,這個人對應的幾號。。。。 總結: 1.記得約瑟夫環問題,大一上思考

環問題的兩種解決方式(迴求解和陣列模擬求解)

約瑟夫環問題各位Acmer肯定都遇到過,就是給你編號為從0~n-1的n個人,從頭開始報數,報到m的人離場,問最後留下的人是幾號。有兩種方法解決這個問題 第一種:陣列模擬 這種方法沒什麼好說的,就是模擬報數和離場的過程,加個訪問陣列標記一下誰離場了就好了 package H

HDU 5643 King's Game | 變形

printf for hdu bsp esp ret inf color long 經典約瑟夫環 1 int f[N] ={ 0 }; 2 for(int i=2; i<=n; i++) 3 { 4 f[i] = (f[i-1] + k) %

zcmu-1862 zbj的狼人殺(迴環變形

Problem I: zbj的狼人殺 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 140  Solved: 44 [Submit][Status]

小模擬特訓(UVA133 救濟金髮放)問題變形

問題描述 n(n<20)個人站成一圈,逆時針編號為1~n。 有兩個官員,A從1開始逆時針數,B從n開始順時針數。 在每一輪中,官員A數k個就停下來,官員B數m個就停下來(注意有可能兩個官員停在同一個人上)。 接下來被官員選中的人(1個或者2個)離開隊伍。輸入n,k,m

問題及變形:poj 1012

約瑟夫問題是個有名的問題:N個人圍成一圈,從第一個開始報數,第M個將被殺掉,最後剩下一個,其餘人都將被殺掉。例如N=6,M=5,被殺掉的順序是:5,4,6,2,3,1。 給定N個人和m,計算最後獲救者的編號,求解的思路是一種遞推思

UVA 1452 Jump(變形)

當i=2時,可以求出第二死的,當i=3時,可以求出第三死的,那麼只要像第一死的一樣遞推下去就可以了。#include<iostream> #include<cstdio> #include<

poj 1012 & hdu 1443 Joseph(變形

題目連結: Description The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n

LA3882(問題及變形

我相信大家早就瞭解了約瑟夫問題 如小學的  猴子選大王:一堆猴子都有編號,編號是1,2,3 ...m,這群猴子(m個)按照1-m的順序圍坐一圈,從第1開始數,每數到第N個,該猴子就要離開此圈,這樣依次

用C++實現環的問題

content 人在 -h tel padding next family bsp sun 約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最後剩下一個,其余人都將被殺掉。比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最後剩下1

C++:順序表類實現問題_密碼不同

class josephus main clu 定義 void seq esp while //.h #pragma once#include <iostream>using namespace std;#define MAXSIZE 100 template

[51nod1073]

成了 out namespace include 結果 div sin cin 比較 解題關鍵:此題不需要模擬,可以用數學方法解決。 無論是用鏈表實現還是用數組實現都有一個共同點:要模擬整個遊戲過程,不僅程序寫起來比較煩,而且時間復雜度高達O(nm),當n,m非常大(例如

51nod 1073歸公式法

tar con for names 問題 print 第一個 描述 span 約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈

環問題

clas 分享 技術 () trac == 約瑟夫環問題 avi str 約瑟夫環問題:50個人圍成一圈,數到3和3的倍數時出圈,問剩下的人是誰?在原來的位置是多少? 思路例如以下: 1)首先,把數據填充到數組或鏈表中。 2)用一個while循環進行出圈。直到

codves1282 問題 鏈表 會 T

操作 找到 end 約瑟夫 bsp cstring ostream 快速 ase codves1282 約瑟夫問題 STL LIST 鏈表 暴力模擬 但是會 T list 聽說正解是線段樹分析一下,我們有以下兩種操作: 1. 找到剩余隊列中第K個人在數組中的位置2. 刪

用循環鏈表解決環問題

循環 解決 使用 end head als list output 循環條件 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規