Задача А. Треугольники
Тематика: Теорема Пифагора, перебор
В данной задаче нужно было написать функцию, проверяющую, что три точки образуют прямоугольный треугольник. Сделать это можно было множеством способов, один из самых простых - теорема Пифагора
Чтобы избежать проблем с погрешностью, можно было не извлекать корень, а использовать квадрат расстояния.
Чтобы проверить треугольник на почти прямоугольность, нужно было поочередно подвигать каждую точку во все 4 направления и проверить получившийся треугольник в нашей функции. Для быстрого перебора смещения, можно использовать два массива dx={-1,0,1,0} и dy={0,1,0,-1}. Тогда следующий код давал бы нам координаты смещенной точки:
for (int i = 0; i < 4; i ++)
{
int x = dx[i] + px;
int y = dy[i] + py;
}
Задача B. Платформы
Тематика: Симуляция
Рисунок к задаче:
В данной задачи нужно было определить координату падения кузнечика. Для этого просто будем хранить положение кузнечика в данный момент.
Для того, чтобы программа не работала слишком долго, нужно "продвигать кузнечика" по платформе за О(1) (не в цикле). Кузнечик сделает j = (righti-x)/d прыжков по i-ой, платформе, где x - координата кузнечика (он уже стоит на платформе) а righti - правая координата платформы. Поэтому кузнечка сразу можно передвинуть на j*d право.
Задача C. Полоска
Тематика: Перебор
Для решения данной задачи нужно было хранить две суммы S1 - сумма чисел слева от разреза (изначально равна 0) и S2 - сумма чисел справа от разреза (изначально равна сумме всех чисел на полоске). В цикле двигаем место разреза слева направо, изменяя значения сумм, и, при необходимости, увеличиваем ответ
Задача D. Продавец Вася
Тематика: Жадный алгоритм, длинная арифметика
В задаче D потребуется длинная арифметика (сложение), так как число 22000 не вместится в int64.
Нам дано условие того, что продавец для каждого размера флешки встретится не более одного раза. Так как 2x > 2x-1 + 2x-2 + ... 20, то прибыль от флешки с самым большим объемом будет больше чем если бы мы продали все остальные флешки. Поэтому в первую очередь нужно попытаться продать самую большую флешку, потом флешку поменьше и т.д. Таким образом, нужно пытаться продать флешки по убыванию их стоимости
Задача E. Флаг 2
Тематика: Динамическое программирование
В задаче про флаг необходимо воспользоваться методом динамического программирования. Мы будем считать функцию DP(level, A, B) (где A и B - номера цветов, от 0 до 25), которая возвращает минимальное число перекрасок, нужное чтобы перекрасить первые level полосок, причем последняя полоска будет иметь вид ABABAB...
Для пересчета данной функции сначала посчитаем, сколько перекрасок нужно, чтобы привести полоску с номером level к виду ABABAB... (пусть это будет число D). Заметим, что полоску можно покрасить таким образом, если первый цвет предыдущей полоски не был "A", а второй цвет не был "B" (условие того, что смежные клетки не должны быть одного цвета) или же это должна быть первая полоска. Поэтому DP(level, A, B) = min(DP(level-1, i, j)) + D , i = 0..25, j = 0..25, i != j, i != B, j != A.
Оценим время работы программы: O(N*26*26*(M+26*26)), эта константа не превышает 4*108
Спасибо за внимание! Решения не претендуют на оптимальность
Задача D. Жадность еще более жадная :) Из возможных вариантов продажи флешки нужно выбирать самый поздний, потому как все win'ы после нее и все win'ы от текущего до ближайшего снизу sell'a станут недействительными.
Елки-палки! Я пропустил в задаче D строчку насчет того, что продавец для каждого размера флешки встретится не более одного раза.
Сидел, пытался придумать ДП, которое бы проходило по памяти и времени - в итоге ничего не придумал.
Да и еще вопрос. Какое время работы O выполняется за 1 секунду на данном сервере?
Елки-палки! Я пропустил в задаче D строчку насчет того, что продавец для каждого размера флешки встретится не более одного раза.
Сидел, пытался придумать ДП, которое бы проходило по памяти и времени - в итоге ничего не придумал.
Да и еще вопрос. Какое время работы O выполняется за 1 секунду на данном сервере?
Почему спросил про время.
Просто у меня идея по задаче Е была точно такая же. Только я побоялся ее писать, т.к. подумал что она не пройдет по времени. За N*M*26 ничего не придумал.
Имеется в виду константа стоящая под знаком О()
Откуда взята 4*108? Никогда не используйте данное число (2*108 операций за 1 секунду), так как тут имеются в виду простейшие операции +-, еще не учитывается кеширование и работа с памятью, а также мощность сервера.
Задача E. что хитрого в 7-ом тесте ? или я дурак или лыжи не едут,
кто может найти баг?
http://www.everfall.com/paste/id.php?iw0dwgcnfx7r
Anyone has a faster alg ?
If you use Java for this problem, "dumb" solution (with constraint 26^4 for DP step) will get TLE. I wrote more complicated solution, where we count minimal value of recolorings in previous line, with which we can go to specified coloring of current line). This way we can get smaller constraint, cause we can sort values, and check only two of them.
If you want, you can check my solution (submission 70276), where I've implemented this algorithm.
I solved it easily . I save position had minimum value in previous step , it's POS1 , POS2 , DP[level,POS1,POS2] is minimum . In the next step , DP(level, A, B) = DP(level-1, POS1, POS2) + D if (POS1<>A) and (POS2 <> B)
Else DP(level, A, B) = min(DP(level-1, i, j)) + D , i = 0..25, j = 0..25,
After doing a few rounds of this competition though, I'm tired of solutions working in C and not Java :( Slower languages should be given more time (even like, 25% more, though it should probably be closer to 50%), or the time limit should just be larger. The ACM-ICPC does this.
"A customer came to Bob and asked to sell him a 2x MB memory stick. If Bob had such a stick, he sold it and got 2x berllars. "
I am unable to understand this.. suppose for example
in this bob should sell 2^5 to 1st customer because he have memory of that size..
or he will not sell to that customer and keep 2^10 memory to sell 2nd customer.
i completely misunderstood during contest...
Логику перепроверил несколько раз (учитываю занятость всего промежутка), но так и не понял в чем дело: WA Test 10.
Буду очень признателен за содержимое теста или за информацию о том, в чем там подвох.
Is there any way to know the input because i have got WA so many times...
someone please look at my code (71593 ) and tell me error i have tried lot to find out.