C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

TopCoder SRM619: ChooseTheBestOne

有名なヨセフスの問題のアレンジ版のため、ヨセフス数を求める再帰アルゴリズムを改造すると \(O(N)\) で解ける。

愚直にシミューレートした \(O(N^2)\) 解法でも通る。

public class ChooseTheBestOne {
    int dfs(int N, int pos, long k = 1) {
        if (N == 1) return 0;
        long target = (pos + k * k * k) % N;
        var p = dfs(N - 1, (int)target-1, k + 1);
        if (p >= target) p++;
        return p;
    }

    public int countNumber(int N) {
        return dfs(N, -1) + 1;
    }
}