PTA猿王の選挙(ヨセフスの問題)

件名の説明:

サル猿王の新しいグループを選択します。猿新しい選択方法であって、Nが順次に1からNの位置に特定の番号から始まる番号が付けられ、唯一の候補円サル許します。ランク1 countin開始から、1から3匹のサルのレポートは、円を終了し、同じ番号が報告下次いでから直ちに猿を開始するラウンドあたり3を、報告します。サイクルだから、最後は猿王の猿を選出したまま。元の解像度は、いくつかの猿猿の王に選出されたのでしょうか?

入力フォーマット:

正の整数N(≤1000)に単一ラインに。

出力フォーマット:

猿王は、行出力数に選出されました。

サンプル入力:

11

出力例:

7

アイデアの分析:

  1. これは、クラスヨセフスの問題です。円のサイズは、サルは値が0~3終了サークルなる報告するとき、アレイ、および各サル1に割り当てられた初期値を作成することができます。この値は、kがK == N-1、出射kの数、すなわち、残数が、ゲーム終了1である場合に1だけインクリメントされ、後に実行される処理を変更します。
  2. そして、ヨセフスの問題は、0からN-1に重複配列を実行するように簡略化することができます。サイクルに決意条件を追加し、0の配列要素の値はスキップされます。値は要素1に遭遇したとき、カウント== 3、値は0になり、kは++、再びカウントを数える場合ステートメントは、ステートメント数計数にブロック単位で実行された場合、ゼロになります。
  3. 最大アレイにカーソルが、アレイは、再循環、尾のアレイヘッド、すなわちリングは、計数し、カウントが影響されないことが理解されるべきである場合、依然としてパケットリングコンタクトの数として考えられています。

コード:

#include <stdio.h>
int main()
{
	int N, i, count = 0, k = 0, flag = 0;
	//count计数作为报数,是否为3的判断。k计算出局人数,当人数剩余1即可结束。flag标记最后一只数值为1的猴子。 
	scanf("%d", &N);
	int n[N]; //创建一个与猴子人数相同的数组,每个元素代表一只猴子。 
	for(i = 0; i < N; i++)
		n[i] = 1; //当猴子仍参与报数游戏时,数值为1,当猴子出局后,数值为0,以此判断该猴子是否参与报数游戏。 
	while(k != N-1) //当k == N-1,即剩余人数为1,该猴子为大王,游戏结束。 
		for(i = 0; i < N; i++)
			if(n[i] == 1) //n[i]等于0的猴子,则跳过,不参与报数。 
			{
				flag = i; 
				count++; //每一只猴子报数,count加1。 
				if(count == 3) //当n[i]猴子报到count==3。 
				{
					n[i] = 0; //猴子出局。 
					k++; //出局人数加1。 
					count = 0; //count重新报数。 
				}	
			}
	//可以简单理解循环条件只是判断游戏是否继续,循环过程是重复for循环执行,即数组下标重复移动,头尾相接。 
	printf("%d", flag+1); //因为数组从0开始。 
	return 0;
}

より詳細に説明します、私はこのような良いが懸念をたくさんすることができ感じます

リリース元の2件の記事 ウォンの賞賛2 ビュー42

おすすめ

転載: blog.csdn.net/jenny_jack/article/details/104427998