C♯の勉強

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

TopCoder SRM 586: PiecewiseLinearFunction

Y の中にある高さについての解の個数を全て調べるだけ……と思ってたけど普通にシステムテストに落ちた。確かに 'N' の字の形状だと、その間を調べないと答えが 2 になってしまう。
座標に全て2倍にして、 Y の中の要素を +1, 0, -1 したものをしたものを調べるようにした。こういうときは、SelectManyが超便利。

public class PiecewiseLinearFunction {
    public int numberOfSolution(int[] Y, int y) {
        int ans = Y.Count(_y => y == _y);
        for (int i = 0; i < Y.Length - 1; i++) {
            if (Y[i] > y && y > Y[i + 1]) ans++;
            if (Y[i] < y && y < Y[i + 1]) ans++;
        }
        return ans;
    }

    public int maximumSolutions(int[] Y) {
        if (Y.Zip(Y.Skip(1), (y1, y2) => new { y1, y2 }).Any(p => p.y1 == p.y2))
            return -1;
        Y = Y.Select(y => y * 2).ToArray();
        return Y.SelectMany(y => new[] { y - 1, y, y + 1 }).Max(y => numberOfSolution(Y, y));
    }
}