C♯の勉強

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

TopCoder SRM603: MaxMinTreeGame

与えられるグラフは木のため、少なくとも2つは葉がある。

先行は、最初のターンで葉だけを残すことができるため、葉の最大コストのスコアを保証することができる。
後攻は、先行が即ゲーム終了しなかった場合だけ、ターンが回ってくる。初期状態の葉のうちの残っている方だけ残すことで、「葉の最大コスト」より大きいスコアを取らないで済む。

上記より、「葉の最大コスト」が答え。

public class MaxMinTreeGame {
    public int findend(int[] edges, int[] costs) {
        int n = edges.Length + 1;
        var degree = new int[n];
        for (int i = 0; i < edges.Length; i++) {
            degree[i + 1]++;
            degree[edges[i]]++;
        }
        return E.Range(0, n).Where(i => degree[i] == 1).Max(i => costs[i]);
    }
}