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