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

Автор NSV, 13 лет назад, По-русски

Здравствуйте!

Не так давно закончился пятый тур SnarkNews winter series — 2012. Поэтому, наверное, уже можно обсуждать задачи? У многих участников задача D — Triangles and circles не зашла с первого раза.

Мне бы очень хотелось узнать, как её решали другие участники. Если где-нибудь уже есть разбор этой задачи, прошу прощения, не нашел. Буду очень благодарен, если кто-то поделится ссылкой на него или напишет, как делал.

К сожалению, я пока так и не смог преодолеть в дорешке барьер WA 5 :)

Решить её пытался следующим образом:

Проверка условия

можно ли треугольник со сторонами a, b, c поместить внутрь окружности радиуса r так, чтобы все его точки лежали внутри или на границе окружности.

1. Если треугольник остроугольный

Т.е., если выполняется условие:

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

Площадь S найдем по формуле Герона:

где

Подставив, получим исходное неравенство в следующем виде:

что равносильно

2. если треугольник не остроугольный

Очевидно, что треугольник поместится в случае, если половина его наибольшей стороны будет не больше, чем радиус окружности, т.е.

Определение максимального числа возможных пар

Я делал следующим образом:

Представим задачу в виде графа, в котором есть вершины двух типов (треугольники и окружности), где связь характеризуется возможностью помещения треугольника в окружность.

  1. Составим списки смежности вершин одного типа с другими.
  2. Среди вершин одного типа находим вершину с наименьшей степенью.
  3. Затем перебираем смежные с ней вершины и находим там с наименьшей степенью.
  4. Удаляем ребро, которое соединяет эти вершины вместе с самими вершинами. Следовательно, удаляются ребра, которые исходили из этих вершин. И увеличиваем ответ на 1.
  5. Повторяем шаги 2 — 4 пока остаются ребра.

Заключение

Скажите, пожалуйста, где и что я делаю не так. Вот мой горекод, который падает с WA 5.

Спасибо!

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

возможно ваша проверка верная, но скорее всего вторая часть решения неверная, вторую часть алгоритмом куна можно

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

Я посчитал радиусы окружности, в которую поместится треугольник. Получился массив t[] И еще у нас есть массив r[] -- радиусы тех окружностей что даны. Теперь отсортируем оба массива и найдем жадно максимальное паросочетание.

Я решал в даблах, когда я сравнивал радиусы с eps=1e-9 то у меня был WA. А когда с 1е-10, то она засчиталась.

Ваше сравнение радиуса и треугольника кажется хорошим, точным. Можно отсортировать треугольники по величине: (a * b * c)^2 / ((a + b + c) * (a + b — c) * (a — b + c) * ( — a + b + c))

и потом тоже жадно найти паросоч...

»
13 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

Замени int на long long, и всё зайдёт. Инфа сто процентов.

Я, кстати, сдал обычным Куном.

»
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Всем спасибо! Задача прошла. Проблема была действительно в переполнении int'а :)

»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А обязательно использовать алгоритмы поиска максимального паросочетания? Разве не работает такая жадность: посчитаем для каждого треугольника минимальный радиус r круга, в который он поместится; а потом просто для каждого круга будем брать треугольник с максимальным значением r, который поместится внутрь?

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

    Можно. Я вроде не использовал алгоритмы поиска максимального паросочетания.

    Только в вашем случае, если я правильно понимаю, придется считать в double. А в целых числах наверное предпочтительнее будет.

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

      Можно еще проще: перебирать круги в порядке возрастания радиусов и вставлять внутрь любой подходящий треугольник. Так спокойно можно в целых числах все делать.

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

        Просто любой подходящий треугольник o_O? Или же из кучи подходящих треугольников выбирать тот, который подходит меньшему числу окружностей? Просто ваш способ наталкивает на мысль, что это тоже, что брать любые пары подходящие друг другу, без всяких сортировок. Или сортировка по возрастанию радиусов как-то влияет?

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

          Влияет. Все треугольники, которые можно поместить внутрь текущего круга, можно поместить в круги, которые мы будем рассматривать дальше. Поэтому нам не важно, какой из подходящих треугольников вставлять в текущий круг.