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)); } }