C♯の勉強

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

TopCoder SRM580: EelAndRabbit

うなぎの通過する時間の区間の端点で切った結果が変動する。よって、その端点を2つ選んで全部試せば良い。
端点といっても開始と終了を両方試す必要はなく、片方だけ試しても良い。

LINQで集合演算的に処理してみた。

public class EelAndRabbit 
{
    public int getmax(int[] l, int[] t) {
        int n = l.Length;
        var candidate = t.ToArray();
        var catchUnagiPatterns = candidate
            .Select(c => Enumerable.Range(0, n)
                .Where(i => t[i] <= c && c <= t[i] + l[i]).ToArray())
            .ToArray();
        return (from pattern1 in catchUnagiPatterns
                from pattern2 in catchUnagiPatterns
                select pattern1.Union(pattern2).Count()).Max();
    }
}