Пример #1
0
        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();
        }