Блог пользователя andryk

Автор andryk, 13 лет назад, По-русски
Хочу рассказать как я решал задачу на сегодняшнем контесте.

Что бы уравнение имело хотя бы один корень, дискриминант должен быть не меньше 0.
Получаем
p - 4q >= 0
p >= 4q

Что такое вероятность? Это отношения положительных событий ко всем. В данном случае положительное событие - такая пара (p,q) для которой p >= 4q .
А все события? Это все возможные пары (p, q). Так как числа выбираются на промежутке и могут быть действительными, таких пар существует бесконечное количество. Как же их подсчитать?
Вспомним что такое декартово произведение. Это как раз множество всех таких пар. И главное, что такое произведение можно изобразить как прямоугольник в системе координат x,y, где по оси x - отрезок [-b,b], а по оси y - [0,a].
Тогда его площадь - величина всех возможных пар (p,q)
Тогда искомая нами площадь - та часть прямоугольника, для которой выполняется p >= 4q
Что бы найти ее, проведем прямую y = 4x, нужная нам фигура будет находится выше этой прямой.
Таким образом ответ - отношение площади найденной фигуры ко всей фигуре.
Ну а площадь фигур думаю найти труда не составит.
Только не забудьте учесть еще один вариант, когда 4b < a.
А также два особых случая когда a = 0,  а также когда b = 0.
При a = 0, останется только правая часть графика, что даст нам вероятность 0.5.
При b = 0, любые p будут больше за 4q, поэтому вероятность 1.0

Прилагаю картинки для лучшего понимания

Разбор задач Codeforces Beta Round 69 (Div. 1 Only)
Разбор задач Codeforces Beta Round 69 (Div. 2 Only)
  • Проголосовать: нравится
  • +35
  • Проголосовать: не нравится

13 лет назад, # |
Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

Спасибо, именно эти картинки я и нарисовал когда думал над решением. Ещё нужно не забыть про вырожденные случаи a == 0 или b == 0.

  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
    Спасибо что напомнили. Сейчас добавлю в топик)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Извиняюсь, я начал ветвь дискуссии, забыв переключиться на english, поэтому всё равно она не видна англоязычным читателям. В общем местами нужно поменять последние два кейса. Если b == 0, то не важно чему равно a, всё равно результат равен единице, на втором шаге нужно проанализировать случай a == 0 && b != 0. И потом все остальные.

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        У меня в коде просто так
        if(b==0) {
                cout<<1.0<<endl;
                return;
            } 
            if(a==0) {
                cout<<0.5<<endl;
                return;
            }
        ну а дальше уже решаем стандартный случай.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ага, у меня тоже так же. Но b таки проверяется раньше a, что немного неочевидно из записи в блоге. Впрочем, это уже мои придирки.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Это такое в школе учат?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ну вообще помню что то такое было. Но нормально рассказывали  на первом курсе матанализа)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Хороший у вас был курс матанализа. А я вот только из топкодерских editorial'ов такое научился быстро понимать.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А меня такого не научили ни в школе, ни (пока) на матанализе. Но зато на матанализе научили интегрировать - и я здесь взялся за интегрирование... А уже после интегрирования додумался до того, что действительно выходит вот такое решение - надо было только немного подумать, а не лезть сразу в интегрирование.

      В школе мало чему учат, однако это не мешает школьникам решать задачи не хуже многих студентов:)

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вот именно. У меня сейчас на 1 курсе только матанализ серьезный. 
        Все остальное нужно самому учить(

        Для себя понял что когда думаешь над задачей нужно больше рисовать, писать - как то лучше думается когда все мысли на бумаге)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Ну вообще говоря, этому учат на курсе теория вероятностей и мат. статистика (лично меня). Эта задача - типичный пример геометрической модели вероятностей, когда вероятность какого-то события - это его мера, деленная на меру фигуры, где лежат все события. (В общем случае, мы можем иметь дело не только на плоскости, но в n-мерном пространстве).
  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Дают знания,позволяющие дойти до решения.
    Я(школьник), например, решил.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      да, а если еще и ботаешь матем, то дойти до решения очень просто :)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
GOOD 77B not ,
Codeforces Beta Round #69 (Div. 1 Only) Problem B
Codeforces Beta Round #69 (Div. 2 Only) Problem D
this is better :D
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Понятно...ну тогда моя совесть чиста:)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Excellent clarification (albeit weak English ;) ). Thanks a tons though.

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а я решал просто по законам зависмых и независимых вероятностей. как-то так
            int x = nextInt();
            int y = nextInt() * 4;
            if (y == 0) {
                System.out.println(1);
                continue;
            }
            if (x == 0) {
                System.out.println(0.5);
                continue;
            }
            if (x < y) {
                System.out.println(0.5 + 0.5* ((double)x/(y*2)));
            } else {
                System.out.println(0.5 + 0.5*((double)(x-y)/x + 0.5*((double)y/x)));
            }
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I solved it differently.
It is really interesting to note , people think so differently yet do the same thing.
Feynman Rocks!
13 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится
Не совсем понимаю при чем тут матанализ, про который все говорят. Обычное геометрическое определение вероятности, см. теорвер.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Можно вполне обойтись и без интегралов и двумерного геометрического представления вероятности. У нас есть два отрезка: [0, a] и [-b,b]. Нам нужно посчитать вероятность p из [0, a], q из [-4b,4b], что p >= q, причём p, q выбираются отдельно на своих отрезках. При выборе q из [-4b, 0] это всегда выполняется. Вероятность того, что q будет на этом отрезке есть 1/2 (из 4b / 8b). Далее, теперь можно рассматривать только [0, 4b].

Если a <= 4b, то мы можем выбрать равные отрезки [0, a] (т.е. и p и q выбираются отдельно на этом отрезке). Тут единственное место в этом решении, где нужно сообразить, что p <= q и p >= q на таких одинаковых отрезках равновероятны, а вероятность p >= q есть 1/2. Вероятность того, что q попадёт в отрезок [0, a] есть a/4b, а в оставшийся есть (4b - a)/4b (но в данном случае p < q и рассматривать не нужно). Получаем формулу:
possibility = 1/2 + 1/2 * (1/2 * a/4b)

Если a > 4b, рассуждения аналогичны предыдущим. Выбираем максимальный равный отрезок, который теперь будет [0, 4b], а вероятность попадания в него есть 4b/a. В данном случае надо рассмотреть оставшийся отрезок, вероятность попадания в него есть (a - 4b)/a (в таком случае p >= q выполняется всегда). Получаем формулу:
possibility = 1/2 + 1/2 * (1/2 * 4b/a + (a - 4b)/a)

Необходимо учесть единственный крайний случай, когда b == 0 (ответом будет единица).
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Формулу нужно упростить, чтобы не было деления на а.

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да, и вместо 1/2 писать 0,5. А то тоже лишнее деление.
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Не совсем понимаю, серьёзно ли вы. Если да, то это просто придирка, т.к. тут выписаны формулы для расчётов (не готовый код программы, и даже не псевдокод). В формулах зачастую удобнее и нагляднее бывает работать с рациональными дробями. Да и если бы я всё выносил, было бы сложнее понять откуда берутся части формулы при прочтении комментария.

        P.S. "Premature optimization is the root of all evil in programming."
        • 13 лет назад, # ^ |
            Проголосовать: нравится -7 Проголосовать: не нравится
          Нет, конечно, я несерьёзно. Если честно, я просто под столом валялся - ну как люди умудряются на 25 комментов, временами даже объёмных, обсуждать элементарную задачу?
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Кому как...
            Студентам, возможно, и очевидно,если они сталкивались с подобными вещами.
            Школьникам - нет.
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Ну не знаю. Мне(десятикласснику) хватило трех-четырех минут порисовать на бумаге, чтобы решение стало очевидным. 
»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can't we solve this problem by following method ? for a given p we can have any q from -b to p/4. Therefore this length can be written as :- f(x) = b + x/4 we can integrate f(x) from 0 to a g(a)-g(0)=b*a-a*a/8 and the total number of ways to choose two numbers will be a*2b so probability is = ( g(a)-g(0) ) / 2ab But this is giving WA code

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Yes you can my dear :) if you wait another 4 years, there will be some sort of method named solve, which solves this problem without any code :)