AOJ1275 And Then There Was One

問題リンク And Then There Was One

  • 概要

1〜Nの人が円形に並んでいる。番号Mを消し、残った人の中でK番目の人間を消すことを繰り返す。最後に残るのは何番の人か答えよ。
2 <= N <= 10000
1 <= K <= 10000
1 <= M <= N

  • 解法

LinkedListを使えば、次に消す人物が(現在インデックス+K-1)%List.size()と即座に分かって便利です。

  • ソース
import java.util.LinkedList;
import java.util.Scanner;

//And Then There Was One
public class AOJ1275 {

	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			int n = sc.nextInt(), k = sc.nextInt(), m = sc.nextInt();
			if((n|k|m)==0)break;
			LinkedList<Integer> l = new LinkedList<Integer>();
			for(int i=0;i<n;i++)l.add(i);
			int p = m-1;
			l.remove(p);
			while(l.size()>1){
				p = (p+k-1)%l.size();
				l.remove(p);
			}
			System.out.println(l.get(0)+1);
		}
	}
	
	public static void main(String[] args) {
		new AOJ1275().run();
	}
}