Тарелки должны касаться края стола, а значит, их центры должны лежать на окружности радиуса R - r (см. рисунок).
В случае если тарелки имеют наибольший возможный радиус для данного стола, их центры будут располагаться в вершинах правильного n-угольника, вписанного в эту окружность. Задача сводится к тому, чтобы найти длину стороны вписанного правильного n-угольника и сравнить ее с 2r. Формулу для длины стороны a = 2(R - r)sin (π / n) нетрудно вывести. Для этого нужно рассмотреть прямоугольный треугольник, нарисованный зеленым цветом.
При реализации нужно было аккуратно выделять случай, когда выполняется равенство r = (R - r)sin(π / n) (*). Из-за вычислительной погрешности правая часть может получиться больше левой, что приведет к ответу "NO" вместо "YES". Сравнение в таких случаях нужно проводить с участием маленького ε:
a + ε < b вместо a < b ,
a < b + ε вместо a ≤ b.
Константу ε нужно выбирать таким образом, чтобы она была меньше возможной разности между точными значениями a и b, если они не равны. В частности, при вычислениях по формуле (*) с учетом ограничений задачи эта разница может составить примерно 7· 10 - 7. Поэтому ε = 10 - 7 достаточно, а ε = 10 - 6 - уже нет.
В очередной раз акцентирую внимание на том, что выбор ε зависит от конкретных формул, по которым происходят вычисления и сравнения. Разные решения могут проходить и не проходить с одним и тем же ε .
Задача носила чисто реализационный характер. Заметим, что номер отправленной открытки однозначно определяется номером друга и множеством открыток, имеющихся у Александра в данный момент. Разберем пример из условия.
1 | 2 | 3 | 4 | |
{1} | - | 1 | 1 | 1 |
{1, 2} | 2 | 1 | 1 | 1 |
{3, 1, 2} | 3 | 3 | 1 | 3 |
{3, 1, 2, 4} | 3 | 3 | 1 | 3 |
Первый столбец таблицы содержит множества открыток, получающиеся у Александра после получения каждой очередной открытки. Номера в множествах записаны в порядке приоритетов Александра. Каждый i-й из следующих четырех столбцов содержит номера открыток, которые получит i-й друг из соотвествующих множеств. Наша цель - выбрать для каждого друга самую предпочтительную открытку из его столбца.
Заметим, что чтобы по текущему множеству Александра и номеру друга определять, какая открытка отправится этому другу, не обязательно знать все множество Александра. Достаточно только двух самых приоритетных открыток. Поэтому для каждого момента времени найдем две самых приоритетных открытки среди имеющихся. Используя их, определим, какая из них отправится каждому другу (посчитаем столбцы таблицы). Потом выберем элемент с максимальным приоритетом в каждом столбце. Получаем решение за O(n2).
Решение 1. Предположим, что ответ на задачу k. Если среди заданных чисел более k одинаковых, то ясно, что мы не сможем их все использовать (потому что мы не можем использовать в одном снеговике одинаковые комы), поэтому оставим из таких комов k, остальные отбросим. Далее отсортируем радиусы в порядке невозрастания. После этого любые два кома с номерами i и k + i различны. Составим снеговиков из комов с номерами (1, k + 1, 2k + 1), (2, k + 2, 2k + 2), (3, k + 3, 2k + 3) и т.д. Если общее количество оставшихся комов не меньше 3k, то у нас всегда получится сделать k снеговиков. Теперь, когда мы умеем отвечать для фиксированного k на вопрос, можно ли составить k снеговиков, можно подбирать k бинарным поиском.
Решение 2. Посчитаем количества комов каждого размера и будем жадно выбирать три наибольшие кучки, брать из них по одному кому и отбрасывать их, и так до тех пор, пока возможно. Почему это правильно? Пусть ответ на задачу k. Если в каких-то кучках больше k комов - будем считать, что их там k, потому что остальные комы мы все равно не используем. Правильность алгоритма докажем через
Утверждение: если в каждой кучке ≤ k комов, при этом суммарное количество комов ≥ 3k, то можно сделать ход по алгоритму.
Утверждение верно, потому что по принципу Дирихле найдутся хотя бы три непустые кучки. Если есть хотя бы 3 кучки размера k - можно беспрепятственно сделать k шагов алгоритма. Если таких кучек одна или две - первым ходом мы обязательно уменьшим их и перейдем к ситуации для k - 1. Если кучек размера k вообще нет, мы тоже после первого шага получим кучки размером ≤ k - 1 и суммой ≥ 3(k - 1). Таким образом, мы всегда сможем сделать k шагов и получить ответ k.
С точки зрения реализации второго решения удобно посчитать количества кучек с каждым размером комов (при помощи сортировки и "сжатия координат") и использовать set для работы с этими количествами. Время работы обоих решений - .
Решение 1 (жадность). Оптимальный порядок решения задач - в порядке возрастания (неубывания) сложности. При этом задачи, решенные до Нового года, нужно отправлять в 0:00, решенные после Нового года - сразу после их решения.
Почему такой порядок оптимальный, докажем методом спуска. Общая схема рассуждений такова: предположим, что имеется оптимальный ответ, в котором задачи решаются не в порядке возрастания сложности. Покажем, что от него можно перейти ("спуститься") к другому варианту, который будет не менее оптимальным. В итоге такими шагами придем к отсортированному варианту.
Итак, предположим, что в оптимальном ответе есть пара задач, сложности которых идут в порядке убывания. Тогда есть две задачи, решаемые подряд и обладающие этим свойством. Предположим, они обе решаются до Нового года. Тогда от смены их порядка суммарное штрафное время не изменится (а значит, не ухудшится). Если обе задачи решаются после Нового года, то их вклад в общее штрафное время (T + ai) + (T + ai + aj), где T - время начала решения первой из них (с номером i), ai - время решения первой задачи, aj < ai - время решения второй задачи. При перестановке этих двух задач получаем штрафное время (T + aj) + (T + aj + ai), что меньше чем (T + ai) + (T + ai + aj). Осталось рассмотреть случаи, когда одна из соседних задач, стоящих в "неправильном" порядке, "пересекает Новый год". Эти случаи рассматриваются аналогично.
В случае если Геннадий не успевает решить все задачи за отведенное время, следует выбирать наибольшее возможное количество самых простых задач. Действительно, не имеет смысла решать более сложную задачу и не решать более простую: замена большего ai на меньшее не ухудшит ответ. Строгие рассуждения можно провести тем же методом спуска.
Решение 2 (динамика). Сначала, как и в предыдущем решении, выберем наибольшее количество самых простых задач, которые Геннадий успеет решать за отведенное время. Остальные задачи отбросим. Переберем задачу, которая будет решать непосредственно в Новый год (0:00). Остальные задачи, кроме нее, нужно разбить на два множества, одно из которых решается до Нового года, другое - после. Задачи во втором множестве нужно решать в порядке возрастания сложности (известный факт для тех, кто участвует в соревнованиях по правилам ACM). В первом множестве порядок решения неважен. Отсортируем заданные числа по возрастанию и посчитаем динамику d[i][j][k] - наименьшее пенальти, которое можно получить, решив первые i задач, из них j - после Нового года, причем последняя задача после Нового года решена в момент k. Заметим, что по (i, j, k) однозначно определяется количество задач, решенных до Нового года, и суммарное время на их решение. После подсчета динамики вспомним про задачу, которая решалась непосредственно в 0:00 (и которая не участвовала при подсчете динамики). Переберем момент времени до Нового года, когда началось ее решение, и учтем остальные задачи при помощи посчитанной динамики.
Сначала научимся решать подзадачу для одного яруса: составить гирлянду длины s из лампочек ровно k цветов, так чтобы никакие две лампочки одного цвета не шли подряд. При этом варианты, отличающиеся порядком цветов, пока считаем одинаковыми (при необходимости мы всегда успеем домножить на k!). Решение подзадачи нам нужно лишь для k ≤ s ≤ 5000, поэтому считаем динамику за O(s2):
a[s][k] = a[s-1][k-1] + a[s-1][k] * (k -1).
Это были бы числа Стирлинга второго рода, если бы не условие, что одинаковые лампочки не могут идти подряд.
Далее, посчитаем динамику d[i][j] - количество способов сделать гирлянду для первых i ярусов (с учетом правил), чтобы на i-м ярусе было ровно j различных цветов. Состояний будет порядка L (общей длины гирлянды), потому что на каждом ярусе различных цветов не больше, чем длина яруса: j ≤ li (!). Переходы тоже можно делать за O(L), если учесть тот факт, что множества цветов различной мощности различны (!!). Действительно, положим d[i][j] = Amj * a[l[i]][j] * (сумму всех d[i-1][k]), а потом вычтем варианты, при которых множества на i-м и (i-1)-м ярусах получаются одинаковыми. Количества размещений Amj = m(m - 1)... (m - j + 1) можно предпосчитать, так они нужны только для j до 5000.
Таким образом, авторское решение работает за O(L + s2) (L ≤ 107, s ≤ 5000), причем не использует деления (только операции умножения и сложения по заданному модулю).
Начнем с того, как выполнить проверку кандидата на центр симметрии (xc, yc). Рассмотрим все точки, симметричные относительно него для (xi, yi). Они имеют вид (2xc - xi, 2yc - yi). Необходимо выяснить, правда ли, что все они, кроме не более k точек, содержатся в множестве {(xi, yi)}. Это можно сделать за бинарным поиском (предварительно отсортировав заданное множество). Однако существует более быстрый способ проверки за O(n). Заметим, что если изначально точки (xi, yi) были упорядочены, скажем, по возрастанию x, а при равенстве x - по возрастанию y, то точки вида (2xc - xi, 2yc - yi) получатся в порядке, обратном порядку сортировки. Причем вне зависимости от центра (xc, yc). Поэтому если проверять точки (2xc - xi, 2yc - yi) по порядку, можно просто двигать указатель с конца в отсортированном массиве (xi, yi).
Из предыдущих рассуждений следует, что если множество имеет центр симметрии, то для первой точки (в порядке сортировки) парная n-я, для второй - (n-1)-я, и т.д. Учитывая, что k точек могут не иметь парных, переберем первые (k+1) точку с начала массива и (k+1) с конца. Для каждый пары таких точек найдем середину соединяющего их отрезка и выполним ее проверку за O(n). Асимптотика решения - O(nk2).
В заключение пару слов о порядке сложности задач. Сложность задачи - величина субъективная. Особенно когда приходится сравнивать идейную задачу с простой реализацией и реализационную задачу почти без идеи. В результате у разных участников получились разные списки предпочтений. Не могу не признать, что порядок, выбранный при подготовке контеста, оказался не совсем адекватен по отношению, например, к количеству решивших задачи, а тем более мог не понравиться кому-то лично. Тем не менее скажу пару слов в его поддержку. А именно, каким принципами мы руководствовались, когда его выбирали.
Количество баллов за задачу - это в первую очередь ее "цена". Умение решать идейные задачи, ИМХО, должно цениться выше, чем умение решать реализационные. Потому что реализацию на уровне задачи B может научиться писать каждый. А вот идея с сортировкой по задаче D на моих глазах не пришла нескольким сильным и опытным участникам. Что касается порядка задач - никто не заставляет вас решать задачи строго по порядку. Ничего плохого нет, если вам быстро приходит идея по задачам C-D, и вы решаете их раньше B и получаете много баллов. Многие так и поступили. Тем более есть текущее положение участников, которым можно руководствоваться при выборе задач.
по-моему, доказательство жадного алгоритма в задаче D было вполне очевидным. ведь там написано: решить наибольшее кол-во задач. значит начать решать стоит с самых легких. а сдавать необходимо ближе к новому году. самая близкая дата к новому году - сам новый год. а то, что я слил контест, никак не относится к нерациональному решению #2.
Не умею писать дерево отрезков, не знаю, что такое sparce-table)
а такая школота, как я, из 8 класса вообще ее не проходила еще :-)
Пусть задачи решает Геннадий, а отправляет не он, а его сокомандник Х. Естественно, что Х, может отправить только решённую задачу. Время на отправку каждой задачи для Х установим равным 0 - т.е. он может её отправить сразу после того, как её решит Геннадий. Время на решение каждой задачи для Геннадия нам известно из условия
Ничего не напоминает? :)
Классическая задача на алгоритм Джонсона для двух станков.
Какое-то у вас слишком вырожденное сведение получается.
К примеру, вы же не будете искать сумму всех чисел в массиве с помощью предварительно построенного дерева отрезков для сумм, когда в задаче на самом деле не требуется вся мощь этой структуры?
Мне кажется, что и здесь, исходная задача, может быть и является частным случаем той, что вы написали(хотя я в этом не совсем уверен), но смысла в этом никакого нет.
Да дерево отрезков мне вообще не нужно!!!
Я просто по алгоритму Джонсона сортирую массив по минимуму для первого исполнителя, а после 12-00 начинаю отправлять вторым исполнителем готовые, вот и всё.
UPD: Если бы в задаче нужно было ещё время на отправку решения, то задача 1:1 ставала задачей Джонсона и очень похожей на вот эту. В ней кстати есть тесты, где время второго исполнителя равно всё время нулю, т.е. тесты типа именно рассматриваемой задачи из контеста.
Прочитала постановку задачи на e-maxx.ru.
На вид задача другая, так что алгоритм Джонсона тут ни при чем.
Нам же не надо минимизировать суммарное время решения задач, оно вообще-то фиксировано и от порядка не зависит.
И алгоритм, если я правильно прочитала, вы применяете неверно - сортировать надо было бы по минимуму из двух исполнителей, а этот минимум у нас везде одинаковый - ноль.
В свете введённых нами изменений (2-го исполнителя) она будет звучать ну хотя бы так: какое масимальное количество задач успеет отправить второй исполнитель, при условии что суммарно затраченное время обеими исполнителями (на решение и на отправку) будет минимально.
Вот так приблизительно, если Вы это хотели услышать.
Извините конечно, но от дальнейшей дискуссии вынужден отказаться, так как завтра утром ещё на работу вставать, а до того желательно выспаться... :)
Я вообще ничего не хотела услышать, извините :)
Хотела донести, что алгоритм Джонсона не является решением более общей задачи, так что для доказательства не годится. Да и для решения тоже, сортировка другая.
Там, в постановке задачи о двух станках, не ограничено общее время. А в задаче D ограничено.
Доброе утро :)
Доброе утро!
Только ограничений в этой модифицированной задаче Джонсона не одно, а два, что чётко указано в условии задачи:
- 2-й исполнитель начинает работать с H2:M2
- 1-й исполнитель может работать только с времени H0:M0 до времени H1:M1.
А так - очень даже симпатичная модификация на тему задачи Джонсона - мне понравилась.Хотите решать по-другому - решайте, но ведь широко известен факт, что любая хорошая алгоритмическая олимпиадная задача имеет несколько решений (некоторые утверждают что должна иметь несколько решений)
.
Автором в разборе разобрано два подхода к её решению - очень хорошо. Я предлагаю 3-й. И то, что он нашелся говорит только в пользу задачи, а не против неё!
Я вот, например, честно говоря, до сих пор не очень понимаю как же у вас все-таки получилось свести исходную задачу к алгоритму Джонсона, т.е. я понимаю, что вы добавили несколько каких-то необычных ограничений, и считаете, что алгоритм Джонсона справится и с получившейся задачей. Мне это совсем не очевидно.
Наверное в чем-то был прав был своим поступком anonymous - я уже начинаю подумывать, а не пойти ли вслед за ним.
"Ну до чего же "добрейшие" люди на КФ..."
(с) anonymous - Из неопубликованного
Мы считаем, что на втором станке мы обрабатываем детали за 0 времени, а на первом за столько, за сколько мы умеем решать задачу?
Как я заметил, у нас появилось несколько ограничений на то, когда мы можем обрабатывать деталь на первом станке, а когда на втором.
То что я прочитал из описания на e-maxx.ru - это сортировка по минимуму из времени обработки детали на первом и втором станке или что-то вроде того. Минимум - всегда 0? То есть подходит произвольная сортировка? Это же неправильно?
Что я понял не так?
Или вы все-таки хотите сказать, что с оригинальной статьёй ваше сведение никак не связано, просто вы считаете, что задачку можно свести просто к какому-то алгоритму, который вам чем-то напомнил алгоритм Джонсона? Если да, то мне на самом деле спорить не о чем, так как я ожидал, что вы можете строго формально провести сведение.
Мы сортируем как в алгоритме Джонсона: по минимуму: если этот минимум достигается для первого исполнителя - ставим в начало очереди, если для второго - то в конец.
При равенстве некоторого диапазона времен для первого исполнителя (локальных минимумов) сортируем по критерию для второго, при равенстве некоторого диапазона времен у второго исполнителя (локальных минимумов) - по критерию для первого.
Так как у 2-го все времена одинаковы (равны 0), то естественно, что сортируем по критерию для первого исполнителя - т.е. ставим в начало очереди.
Ну а подсчёт шрафного времени - то уже детали реализации для конкретной задачи.
Вот это "естественно" как раз и требует доказательства, и в статье на emaxx ниоткуда не следует.
Я, видимо, злой и бесчувственный человек, но я все-таки постараюсь объяснить, что вы неправы, с другого конца: обобщение задачи D не является задачей о двух станках.
Что если предположить, что второму исполнителю все-таки требуется какое-то время на отправку задачи? Ну, например, есть 35 легких задач, которые решаются за 10 минут и отправляются за 0, одна задача, которая решается за 20 минут и отправляется за 2 минуты и еще одна, которая решается за 15 минут и отправляется за 1?
Оптимальным решением обобщенной задачи D было бы послать сначала 35 легких, потом ту, что решается 15 минут (+16 к штрафу), потом ту, что решается 20 (+37 к штрафу).
И закончить в 0:37 со штрафом 53 минуты.
А оптимальным решением задачи о станках будет решить 35 легких, потом ту, что решается 20 минут (+22 к штрафу), а потом ту, что решается 15 минут (+ 36 к штрафу). И закончить в 0:36 со штрафом 58 минут.
Contest 140 Problem E Can anyone explain how d[i][j] is calculated?
All d[i][j] can be calculated in O(L) operations, because sets of colors with different cardinalities are always different (!!). Indeed, put d[i][j] = Amj * a[l[i]][j] * (sum of all d[i-1][k]), and then subtract variants with equal sets on the i-th and (i-1)-th layers. Coefficients Amj = m(m - 1)... (m - j + 1) can be pre-calculated because they are required only for j ≤ 5000.
Thanks in advance..
I think it works like this.
First of all , the O(L) thing. for each i , when we calculate d[i][j] , j can get a value of at most l[i]. so,
summing for all i's => l[i] numbers of iteration for each i => l[1] + l[2] + l[3] ... + l[n] => L
; hence O(L)
Secondly ,
d[i][j] only depends on ( d[i-1][k] , for all k , where 1 <= k <= m ) ;
About the "subtract" part, if segment i-1 contains x colors , and segment i contains y colors , where x != y , then due these cardinalities do not match , they can never cause any problem for us.
We only need to subtract the configurations in cases like this when we contribute from d[i-1][k]'s ans to d[i][k]'s ans.
Finally , the Aj part which can be written as mPj ; its simply nPr = n*(n-1)*(n-2)...(n-r+1).
1045908 Solution
Can someone give the diagram in the first question?
prob F when N goes bigger(>3000) how can it be possible to find so many right point?
//20337403
I used to suppose 0 or 1 is right...