public void Solve(TextReader input, TextWriter output) { var scanner = new StreamTokenizer(input); int testNum = scanner.NextInt(); Random rnd = new Random(); foreach (int caseId in Enumerable.Range(1, testNum)) { int n = scanner.NextInt(); double d = scanner.NextDouble(); double[] p = new double[n]; int[] v = new int[n]; for (int i = 0; i < n; i++) { p[i] = scanner.NextDouble(); v[i] = scanner.NextInt(); } double left = 0, right = 1E12; while (right - left > 1E-8) { double mid = (left + right) / 2; bool success = true; double bound = -1E10; for (int i = 0; i < n; i++) { if (v[i] > 0) { bound = Math.Max(p[i] - mid, bound); bound += d * v[i]; if (bound - d > p[i] + mid) { success = false; break; } } } if (success) { right = mid; } else { left = mid; } } output.WriteLine("Case #{0}: {1}", caseId, left); } output.Close(); }