白駿11866ジョセフス解題0(JAVA)
質問リンク
ジョセフス問題は以下の通りです.
1番からN番までは、N人が1つの円に座り、正の整数K(≦N)を与えます.今は順番にK人目を除いています.一人が取り除かれると、残りの人からなる円に沿ってこの過程が続きます.この過程はN人全員がクリアされるまで続く.円上の人々が消去される順序を(N,K)−ジョセフス配列と呼ぶ.例えば、(7,3)−ジョセフス配列<3,6,2,7,5,1,4>である.
NとKをあげると(N,K)-ジョセフスシーケンスを求めるプログラムを書きます.
第1行NとKは、スペースを隔てて順次与えられる.(1 ≤ K ≤ N ≤ 1,000)
例に示すように、ジョセフスシーケンスを出力します.
キューで解題すればいいのですが、特別にArrayListに入れてそのままpivotを回したいです.
CYCLEのような大きなピボットを回転させ、ピボットに対応する数を抽出します.
質問する
ジョセフス問題は以下の通りです.
1番からN番までは、N人が1つの円に座り、正の整数K(≦N)を与えます.今は順番にK人目を除いています.一人が取り除かれると、残りの人からなる円に沿ってこの過程が続きます.この過程はN人全員がクリアされるまで続く.円上の人々が消去される順序を(N,K)−ジョセフス配列と呼ぶ.例えば、(7,3)−ジョセフス配列<3,6,2,7,5,1,4>である.
NとKをあげると(N,K)-ジョセフスシーケンスを求めるプログラムを書きます.
入力
第1行NとKは、スペースを隔てて順次与えられる.(1 ≤ K ≤ N ≤ 1,000)
しゅつりょく
例に示すように、ジョセフスシーケンスを出力します.
に答える
キューで解題すればいいのですが、特別にArrayListに入れてそのままpivotを回したいです.
CYCLEのような大きなピボットを回転させ、ピボットに対応する数を抽出します.
ソースコード
import java.util.*;
import java.io.*;
public class Main{
public static void main(String [] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
ArrayList<Integer> group = new ArrayList<Integer>();
ArrayList<Integer> answer = new ArrayList<Integer>();
int pivot = 0;
int numberOfMember = Integer.parseInt(st.nextToken());
final int CYCLE = Integer.parseInt(st.nextToken());
for(int i=0;i<numberOfMember;i++) {
group.add(i+1);
}
while(group.size()!=0) {
for(int i=0;i<CYCLE-1;i++) {
if(pivot==numberOfMember) {
pivot = 0;
}
pivot++;
}
if(pivot==numberOfMember) {
pivot = 0;
}
answer.add(group.remove(pivot));
numberOfMember--;
}
bw.write("<");
for(int i=0;i<answer.size()-1;i++) {
bw.write(answer.get(i)+", ");
}
bw.write(answer.get(answer.size()-1)+">\n");
bw.flush();
br.close();
bw.close();
}
}
Reference
この問題について(白駿11866ジョセフス解題0(JAVA)), 我々は、より多くの情報をここで見つけました https://velog.io/@phjppo0918/백준-11866-요세푸스-문제-0-문제풀이-JAVAテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol