Пожалуйста объясните алгоритм, не понимаю как сделать.
Школьный бал
Во время проведения школьного бала планируется запустить m одинаковых воздушных шариков. Наполнить их воздухом согласились n старшеклассников с различной силой духа и выносливостью. Известно, что i-ый участник процесса наполняет один шарик воздухом за ai минут, причем каждый раз после надувания bi шариков отдыхает и переводит дух ci минут (i = 1..n). Нужно узнать за какое минимальное время (в минутах) будут надуты все шарики при оптимальной работе всех участников.
>>674231 (OP) Есть пример входных данных? Смахивает на задачу на упаковку рюкзака, но сходу не могу понять как решить "жадным алгоритмом".
Лезет в голову всякая чушь, уровня разбивать их на пары чтобы пока один надувает другой отдыхал и наоборот, для пары считать время, сортировать по минимальному времени их и отправлять надувать таких вот.
>>674305 А чего ты так мудришь-то с жадным алгоритмом? Просто выбирай шар который влезает с минимальной затратой времени. Время отдыха учитвай как затрату на последний шар.
>>674423 Это да. Но ты хочешь слишком хороший результат получить от жадного алгоритма. Я понимаю, что его можно выбрать в качестве первой итерации. Но когда улучшаешь результат лучше выбрать хороший алгоритм, чем пытаться полировать эвристику.
Ватсон поставил Рыбке простую задачу – найти сумму чисел меньших N, которые должны делиться либо на A, либо на B, и вывести её остаток от деления на 1000000007 (109 + 7). Помогите Рыбке справиться с этой задачей.
Входные данныеі
В одной строке задано три целых числа N, A и B.
1 ≤ N, A, B < 1018.
Выходные данные
Вывести остаток от деления искомой суммы на 1000000007.
>>674548 (1000 99) вариантов, перебором не получится. Требуется точное решение - эвристики и локальный поиск сосут. Остаётся Dynamic Programming и Branch and Bound. Ну или Mixed Integer Programming, если делать по-серьёзке, но это не для олимпиады.
>>674612 Через Dynamic Programming у меня нихуя не получается доказать какое-то свойство решения m шаров через m-1. Там всё хитро именно из-за пауз. Через Branch and Bound можно так: - в качестве нижней границы используй жадную эвристику или какую-нибудь другую эвристику если найдёшь лучше. - в качестве верхней границы убери эти ёбанные паузы и решай стандартный multiple knapsack problem (это-то, я надеюсь, ты умеешь).
>>674637 >>674626 Кароч, не слушай меня, через Branch and Bound хуйня полная получается.
Можно через Dynamic Programming через такое соотношения: Решения для k+1 школьников и l шаров - это когда мы хуйнём x шаров новому школьнику + оптимальное решение для k школьнико и l-x шаров. Дальше, я думаю, таблицу для Dynamic Programming ты построишь сам.
Блять, почему на этом сайте ни одного языка программирования нет? Если уже добавили Java, то могли бы и Clojure добавить, я бы им рассказал как нормально бенчмаркать через Grenchman. И даже Ocaml нет, aleksey ссыт им в ёбыч.
Помоему тут двоичной кучей (минимизирующей) проще всего. В кучу заносятся школьники, ключами служат момент времени в который они завершат надувать очередной шар. Тоесть изначально все ключи в куче равны ai соотвествующего школьника. Потом сверху кучи извлекается школьник, счетчик шаров увеличивается на один, если нужное количество шаров достигается - ответ это ключ вытянутого школьника. Если шаров не достаточно то школьник возвращается в кучу с ключом увеличеным на ai. Из-за того что школьники должны делать перерывы нужно следить за количеством надутых шаров каждым школьником - тоесть в куче нельзя хранить просто чиcла, а должна хранится структура соответсвующая школьнику с помощью который можно ослеживать сколько шаров надул школьник, и если он достиг предела, то школьник возвращается в кучу с ключом увеличены не на ai, а уже на ai + ci (перерыв плюс время необходимое на надутие очередного шара). Сложность этой хуйни полчается равна количеству шаров умноженому на логарифм школьников. Это можно улучшить если придумать способ определить достаточно большой момент времени T, которого однако гарантировано не достаточно для того чтобы надуть все шары. Тогда изменяется начальная процедура заполнения кучи. Для каждого школьника высчитывается сколько шаров он надует за время T (это просто), счетчик шаров увеличивается это количество, и в кучу школьник кладется с ключем равным количеству времени которое осталось ему до надувания следующего шара (оно может не быть равно ai - в зависимости от времени T, может быть даже больше, если момент времени Т попал на отдых школьника). А дальше обычное вытаскивание школьников пока не наберется нужное количество шаров. Сложность получается равна "оставшемуся количеству шаров" умноженому на логарифм школьников. Проблема в способе выбора достаточно большого Т - чем оно больше тем быстрее сработает алгоритм, но при этом нельзя превысить ответ. Я думаю нужно нужно отталкиваться от среднего времени затрачиваемого школьником (с учетем отдыха) - и брать немного меньше от полученого.
>>674670 Почему не гарантирует? У школьников есть более оптимальный способ поведения чем начать всем сразу надувать шары, делая перерывы когда выбиваются из сил?
>>674957 Ну так и будет. Изначально школьники закинутся в кучу с ключами 1, 1, 100. После того как будет вытащен и закинут первый школьник куча будет 1, 2, 100, после следующего 2, 2, 100, на следующем мы наберем нужное количество шаров и ответ - ключ последнего вытянутого школьника, тоесть 2. Подход с кучей моделирует систему школьников. Давать не оптимальный ответ он может только если моделируемое поведение школьников (все сразу начинают надувать шары, делая перерывы когда выбиваются из сил) не оптимально. Естественно я не утверждаю что это идеальный способ решения, я слаб в динамическом программировании, вполне возможно что с помощью ДП можно решить более эффективно.
>>675161 Вопрос не в эффективности, а в корректности. Бремя доказательства в данном случае лежит на тебе. Читать твои телеги мне немного влом, извини. Как только ты сформулировал чёткое и короткое предложение по типу > У школьников есть более оптимальный способ поведения чем начать всем сразу надувать шары я тебе сразу привёл контрпирмер. Сможешь так же чётко и коротко сформулировать доказательство корректности - я проверю.
>>675524 Какие мы важные. Пишешь длинные телеги, в которых смешиваешь в кучу идею с реализацией и даже не думаешь что-то говорить о корректности. Потом ждёшь что кто-то это будет читать, утирать тебе сопли и учить тебя нормально формулировть свои мысли, а потом ещё будет искать контрпример для тебя. Ну ты понял.
>>674231 (OP) пусть есть один школьник наилучшая стратегия для него начинать дуть сразу после отдыха пусть есть 2 школьника есть два варианта 0 надувают одновременно 1 второй начинает дуть с задержкой это либо даст задержку, либо не даст, но время не улучшит никак, поэтому на хуй не нужно
в первом слкучае следующее соотношение будет справедливо для двух и большего числа школьников в виду аддитивности
0 посчитаем поток, с которым надувают шарики 1/ai 1 сложим потоки надува sum(1/ai) 2 надуем с совокупным потоком m/(sum(1/ai)) 3 учтём время на отдых sum(floor(m/(bi)ci))
время надува будет m/(sum(ai))+sum(floor(m/(bi)ci))
>>675577 Задача кстати элементарная, если шариков больше надувающих. По сути только итерироваться по времени и считать шарики. Сейчас сфоткаю и выложу графический способ решения, по которому все станет понятно (в том числе и обосрамс с 8, а не 7)
>>675580 да ну не может там быть 7 минут в семь минут уложится всего 3 шара от третьего и 2 от второго (по 6 минут), значит первому остаётся 5 шаров. 5 шаров у него займут 11 минут.
Таки 8. Но я уже определился с выбором - назовем этот метод "интегрирующим". Для каждого школьника строим числовой ряд - сколько шариков он надувает за текущее время, и суммируем ряды, а дальше ищем искомое время в результирующем ряду.
>>675682 А то. Ты же пользуешься классической механикой, и тебя не ебет, что она неправильная. Так как в своей жизни с такими скоростями или прочими условиями, на которых это будет ощутимо - один хуй не столкнешься.
>номер теста - 1 бит вернее номер теста - это номер теста в исходнике захардкоденное число, инкрементируемое программа смотрит соответствующий бит входных данных, если бит один, то решает тест, если 0 - то фейлит
Маллоком выделяем памяти столько, сколько нужно. Предварительно прогоняем программу, не выделяющую кодирующей памяти вообще, чтобы иметь базовое значение
>>675716 как будто что-то плохое. Важно ведь общее число пройденных тестов. Зачем они вообще показывают номера тестов, если данные от них не выдают, не понятно.
>>675716 И вообще, может тесты детерминированно случайные. То есть у каждого игрока есть случайный seed, на основе которого генерится тестовый набор, фиксированный для каждого игрока.
Кстати, seed можно не генерить для каждой задачи, а выводить с помощью хеш-функции
>>675737 Я помню мне препод мануал выдал по проведению олимпиад, там было чёрным по белому написано что используются 4 группы тестов: выданные на руки с задачей, граничные случаи, рандомизированные и специально спроектированные жури с целью завалить некоторые решения.
>>675742 >и специально спроектированные жури с целью завалить некоторые решения. Это чтоб свои знакомые выиграли, когда оешениям других участников можно подосрать?
>>675747 Я помню, как лет 8 назад после школки возлагал надежды на коколимпиадку вузиковскую. В методичке были примеры заданий и написано что отводится час. По факту - решение требовало не алгоритма, а формулки из матстатистики которую давали на 3м курсе, писать заставили на листке и дали полчаса.
Учитывая, что призом был ноут - специально суки под знакомых заточили, пидоры.
>>675759 Я серьезно - уже на 3м курсе понял, как вспомнил. Требовалась там какая та формула из комбинаторики, сцуко - и все, никакого алгоритма. А я в 11 классе такую знать никак не мог.
>>675862 Твоё определённо лучше, чем ДП. Но оно специфично для задачи. И ещё нужно хотя-бы самого себя убедить в его корректности (что ты сделал с помощью рисунка, это очень хороший метод). А у меня, так сказать, профессиональная деформация личности, после изучения методов дискретной оптимизации я всё делаю стандартными методами. В данном случае интуиция меня подвела, т.к. я думал что задача связана с задачей рюкзака, в которой эвристики не прокатывают.
>>675503 Алгоритм X - каждый сосницкий начинает надувать шары как только может и продолжает до тех пор, пока не устанет. Допустим есть алгоритм Y, позволяющий за то же время надуть больше шаров, чем при использовании алгоритма X. Общее количество надутых шаров складывается из шаров надутых каждым сосницким. Значит в алгоритме Y некоторые сосницкие надувают больше шаров, чем в алгоритме X. А это невозможно. Уж это-то объяснять не надо?
>>676040 в оптимальном некоторые сосницкие шары не трогают вообще. Потому что может быть что у одного из них ампутировали 1.5 лёгкого и один шар он надувает теперь за 1000 минут. >каждый сосницкий начинает надувать шары будет работать только если твой алгоритм умеет отнимать обслюнявленные шары у медленно-дующих инвалидов
>>676084 Верно. Но даже если бы лишних шаров не было формула никак не поменялась бы. От нас не требуется составлять расписание надувания шаров, так что мы можем предположить, что вокруг сосницких бегает препод и оптимальным образом распределяет шары. При таком раскладе ситуация ровно такая же что и с лишними шарами.
>>674231 (OP) Назовём надувание bi шариков + отдых одним циклом, время выполнения которого ti=ai*bi+ci Тогда поделив bi/ti=perfi мы найдём среднюю производительность perfi каждого школьника по времени. Найдём отношение каждого perfi к максимальному max_perf из них и округлив вперёд до целых, мы найдём их соотношения rel_perfi = round(max_perf/perfi) . После чего кидаем каждому школьнику, начиная с самых производительных, количество шакриков, равное rel_perfi
>>679203 У него тупо цикл, а у меня бинарный поиск, понятно что кода побольше. Ну так зато у него сложность O(nT), а у меня O(nlog(T)), где n - число школьников, а T - требуемое время.
>>679240 Это как дергать гланды автогеном через анальное отверстие. В рассматриваемой задаче нахуй не нужно, на скорость не влияет, а на простоту понимания - еще как.
>>679322 Идёт девушка, видит - парень косит траву в противогазе: - Ты что, с ума сошёл - зачем противогаз надел? - Я комсомолец - не могу без трудностей... - Кончай хуйней страдать, пошли лучше потрахаемся. - Хорошо, но только стоя и в гамаке...
Ну что же: http://www.e-olymp.com/ru/problems/32 Мы предлагаем Вам похожую игру, в которой участвуют белая пешка и черный конь. Ходы делаются в соответствии с общепринятыми шахматными правилами. Белые ходят первыми. Белые побеждают, если они смогли провести свою пешку в ферзи и следующим своим ходом черный конь не может уничтожить ферзя. Партия заканчивается вничью, если очередь хода за белыми, но пешка не может продвинуться вперед. Если конь сумел побить пешку или ферзя, то выигрывают черные. Требуется выяснить исход партии при наилучшей игре с обеих сторон.
Вопрос таков - что есть "наилучшая игра с обоих сторон", и как она определяется? В голову приходит разве что завершение игры через максимально долгое время. Правда, если проигравший так долго мог защищаться - выходит игра победившего была неоптимальной?
>>680226 Хотя, походу наоборот - у коня дохуя способов походить, а у пешки - только вперед. Значит, оптимальный - думаю это когда конь натягивает пешку за минимально короткое время (поскольку пешка не может ходить неоптимально, у нее один путь)
>>680234 > натягивает пешку за минимально короткое время Именно минимальность времени в данном случае не важно, так как нужно сообщить результат, а не количество ходов. Тоесть для коня "наилучшей игрой" будет такая последовательность ходов при которой он берет пешку, если у него такая возможность есть. С ходами пешки не совсем ясно. Свой первый ход пешка может сделать как на одну, так и на две клетки. Следовательно для своей "наилучшей игры" пешка должна просчитать результат при первом ходе на одну клетку, и при первом ходе на две клетки. И выбрать тот вариант при котором она выигрывает. Если такого нет, то разницы что выбирать нет. Выбор есть только если пешка начинает со своей начальной по правилам позиции (второй ряд).
>>680243 Я настаиваю на минимальности. Именно игра, которая закончилась минимально быстро - была оптимальной, кмк, так как конь может ее затянуть и просрать в итоге.
Непонятно другое - на самом сайтеце есть два варианта развития событий для g3-a1, если пешка ходит на два хода - то ничья, а если один - то съедается конем. Казалось бы, раз пешка может сыграть вничью - то это и есть вариант когда оба играют оптимально. Но с какого то хуя там в результате программы стоит -1 - если выигрывают черные. Как это понимать?
>>680248 Хотя, ашибочка. Анимашка с примером для пешки на g2, а там где пример входа и выхода - g3, все верно. А для g2 видимо оптимальна именно ничья.
>>680350 А где ее тип то задается? Я ожидал что то вроде Pair<int, double>. Мне вообще то список такой поеботы нужен. Впрочем, я уже плюнул и на кресты перешел.
>>680535 Читай в строку. Потом проще всего будет сделать str[0] - 'a' и str[1] - '0' - получишь индексы. Это не сильно надежно, но для олимпиадки пойдет.
>>680561 > так уже и сделал У тебя там какая-то неочевидная хуита. Я бы работал не с координатами фигур, а с растоянием между ними (отдельно растояние по вертикали и по горизонтали) высчитаное из их начальных позиций. Дальше, пешка на каждом своем ходу (кроме первого) увеличивает растояние по вертикали на один. А конь может увеличить/уменьшить растояние по вертикали или горизонтали на 2 и одновременно увеличить или уменьшить растояние по другой координате на 1. Если растояние стало 0 по обоим координатам то конь победил, если один по вертикали перед ходом белых то ничья. Ну и нужно сначала высчитать ограничение по ходам, связаное с тем что пешка дойдет до верха.
>>680588 Я нихуя не понял. >У тебя там какая-то неочевидная хуита. У меня все очевидно - просчитываются абсолютно все варианты (их 6 штук примерно получается), потом они сортируются (сперва по номеру хода, потом по позиции), а потом берется первый из списка.
Я думаю, что у меня проеб с сортировкой, т.е. с критерием "оптимальной игры обоих сторон"
>>680226 Пришлось делать двумя разными способами чтобы отловить ошибки. Но я сделал это! https://ideone.com/V5zFoc Что, соснули, да? А? А? Ха-ха-ха, ещё как соснули! ( ͡° ͜ʖ ͡°) Пользуясь случаем передаю привет маме.
Этот кусок говна с тестами - неправильный. Конкретный пример - b6 c7. 30й тест ожидает что победят белые, хотя - хуй там плавал. b6b7 c7a6 b7b8 a6b8 - только пешка прорывается в ферзи, как следующим же ходом ее срезает конь >Белые побеждают, если они смогли провести свою пешку в ферзи и следующим своим ходом черный конь не может уничтожить ферзя.
Забавное наблюдение - если нарисовать матрицу смежности, то искомые группы образуют "ступеньки" на картинке, и графическое решение - поиск наикрупнейшего куска "ступенек".
Подумаю, можно ли это использовать в алгоритме решения.
>>681757 Если ты заштрихуешь главную диагональ, то тебе бросится в глаза кое-что другое - полностью заштрихованный квадрит в левом верхнем углу. Это более правильное наблюдение. Максимальная клика всегда выглядит как такой квадрат. Проблема в том, что строки и столбцы могут идти в любом порядке, и строки и столбцы квадрата могут быть разрежены полупустыми строками и столбцами. Просто найти такой квадрат
Когда квадрат выглядит вот так
найти его сложнее. В реальности же там ещё и посторонний мусор будет
>>681782 Ну я собсно ща и проверяю, как оно будет выглядеть - рисую граф повыебистее, а номера позже порандомнее расставлю. >Так что пиши Брона-Кербоша и не выёбуйся. Я про эту хуйню всего лишь 15 минут назад на википедии вычитал. Выглядит слишком замороченно и дрючевно.
У меня пока мысль попроще - начинаем со списка пар, как с минимальных групп размером 2.
Каждую группу пытаемся "укрупнить", сканируя соседние вершины и ища такие, которые будут принадлежаьб каждой вершине в группе.
И так до тех пор, пока не будет получаться увеличить список таких кусков. А дальше - дроп и выбор первого из крупных кусков как результата.
>>681814 В универе я осознал, что мне нравится писать проги для курсача по дискретной математике. Это было лет 7 назад. Потом решал головоломки и олимпиадные задачи из разных источников. Несистематично и с большими перерывами. Читал какие-то статьи про динамическое программирование. Недавно взялся за project euler, решил первые 100 задач, дальше пока ломает. Пару раз участвовал в Code Jam, проходил во 2-й раунд, но не показал особо выдающихся результатов.
А вообще что такого в том, чтобы решить 2-3 задачи? Посмотри на http://codeforces.com/contest/631/problem/A и http://codeforces.com/contest/631/problem/B В a сразу понятно, что l и r надо брать 1 и n. Остаётся в обоих массивах сделать OR всех элементов, и сложить два получившихся числа. 5 минут. В b нужно тупо смоделировать процесс. 10 минут. Остаётся время поковырять C.
>>681789 >сканируя соседние вершины и ища такие, которые будут принадлежать каждой вершине в группе. Есть идея получше. Допустим ты начинаешь с полносвязного графа размера 1 - одной вершины. Ты берёшь полный список всех вершин, и убираешь из него все несвязанные с этой вершиной вершины. Ты получил список всех вершин, которые можно добавить к первой для получения полносвязного графа из двух вершин. Выбираешь очередную вершину, удаляешь из списка кандидатов все вершины, которые не связаны с новодобавленной. Снова в остатке получаешь список вершин, которые можно добавить к имеющимся 2 для получения треугольника. Это работает для любого числа вершин, что позволяет наращивать массив рекурсивно. И это эффективнее чем каждый раз пробегаться по всем вершинам, проверяя, связаны ли они со всеми уже включёнными в рассматриваемый подграф.
Конечно надо как-то избегать ситуации когда ты будешь рассматривать одну и ту же комбинацию по несколько раз. К примеру ты начал с пары вершин 1-2 и нашёл, что её можно вырастить до 1-2-3-4. Когда ты начнёшь с пары 3-4 тебе не надо будет рассматривать возможность добавить к ним 1 и 2, потому что этот вариант ты уже рассматривал.
Чтобы понять как это сделать полезно написать неоптимизированную программу, которая будет выводить список _всех_ клик в графе, а не только максимальных. Ну то есть если у тебя полносвязный граф из 5 вершин, то надо вывести 5 клик из 1 вершины, 10 из 2-х, 10 из 3, 5 из 4 и 1 из 5.
Когда соединишь всё вместе получишь Брона-Кербоша.
>>681996 >И это эффективнее чем каждый раз пробегаться по всем вершинам, проверяя, связаны ли они со всеми уже включёнными в рассматриваемый подграф. Но я не собирался ни по чему пробегаться. Я собираюсь делать все на множествах. Там и циклов по сути никаких не надо, только объединения/пересечения.
>>682014 Да не кипишуй ты, попробую. Всему свое время. Я пока ебусь с std-шными контейнерами. Раньше юзал Qt-шные, не думал что в голых крестах они такое говно, и что даже чтобы банально узнать, есть ли элемент в контейнере - надо ебаться с итераторами.
>>682862 Занимался. Решал. Ездил в соответствующие лагеря (гугли лкш). Ходил во всякие кружки при ИТМО ДС-2 - боярин И везде решал как сучка. Практика - это главное
>>683141 С разной интенсивностью я занимаюсь уже третий год. Но я хуйней страдаю. Знаю много ребят, которые за календарный год добивались призеров на всеросе. Просто надо реально по этой теме угареть, и реально много работать + изначальный предрасположенности
>>683146 Двачую этого, сам я говно, но знаю парочку кто добился, но там адовая дрочильня почти каждый день была. Честно говоря, лучше уж что-то более прагматичное дрочить каждый день, но не мне судить успешных людей, кек.
>>683265 Какая разница, если доставляет? Меня уже не раз захватывал такой поток, что я по 8 часов нарешивал эти задачки, другой вопрос, что потом меня переклинивает и я за один присест в пределах суток прочитываю какую-нибудь книгу, а потом неделю бегаю по утрам, забиваю, начинаю кодить на жабе, забиваю, учусь писать декартовы деревья, читаю китайские публикации по биологии и так далее
На поле размером NxM клеток в точке (x0, y0) стоит робот, который умеет делать шаг на 1 клетку влево/вправо/вверх/вниз (по диагонали не умеет). Посчитать количество вариантов перемещения робота в точку (x1, y1) ровно за k шагов.
Прелесть в том, что шагать робот может по одним и тем же клеткам несколько раз. И мой алгоритм тупо перебором не периваривает большие поля и ходы. А когда попросил данные для теста, то получил вот это
n = 100 m = 100 x0 = 50 y0 = 50 x1 = 60 y1 = 60 k = 200 ответ = 3026331761191340503770893374595925277055394295450130902271922168548205308642694668236259320332359033488388961148337920 время выполенния 5 сек.
Судя по всему тут можно применить какие то формулы комбинаторики, но я них не силен.
>>683471 Ну как я понимаю что я и решал динамическим программированием. Рекурсивно перебираю все воздожные варианты. И мой алгоритм работает, но с маленькими числами, а как его оптимизировать я не знаю, может есть в динамическом программировании какой то раздел. Просто в олимпиадном программировании я не силен.
>>683474 Динамика - это рекурсия развернутая в рекурсивную формулу. Или попросту рекурсия с запоминанием. Подумай, как ты можешь для вычисления очередного ответа не заново всю рекурсию запускать, а лишь обращаться, например, к соседним клетка, и как-то использовать уже предпосчитанную информацию
>>683469 >ответ = 3026331761191340503770893374595925277055394295450130902271922168548205308642694668236259320332359033488388961148337920 Это шцтка юмора что ли? Что это за число ебаный в рот?
три дохуллиона двадцать шесть дохуллионов триста тридцать один дохуллион семьсот шестьдесят один дохуллион сто девяносто один дохуллион триста сорок дохуллионов пятьсот три дохуллиона семьсот семьдесят дохуллионов восемьсот девяносто три дохуллиона триста семьдесят четыре дохуллиона пятьсот девяносто пять дохуллионов девятьсот двадцать пять дохуллионов двести семьдесят семь дохуллионов пятьдесят пять дохуллионов триста девяносто четыре дохуллиона двести девяносто пять дохуллионов четыреста пятьдесят дохуллионов сто тридцать дохуллионов девятьсот два дохуллиона двести семьдесят один дохуллион девятьсот двадцать два дохуллиона сто шестьдесят восемь дохуллионов пятьсот сорок восемь дохуллионов двести пять дохуллионов триста восемь дохуллионов шестьсот сорок два дохуллиона шестьсот девяносто четыре дохуллиона шестьсот шестьдесят восемь дохуллионов двести тридцать шесть дохуллионов двести пятьдесят девять дохуллионов триста двадцать дохуллионов триста тридцать два дохуллиона триста пятьдесят девять дохуллионов тридцать три квинтиллиона четыреста восемьдесят восемь квадриллионов триста восемьдесят восемь триллионов девятьсот шестьдесят один миллиард сто сорок восемь миллионов триста тридцать семь тысяч девятьсот двадцать
>>683466 Взялся читать Конкретную математику стоп, ты назвал её Реальная математика? ну ты лах, решил что буду решать все домашние и контрольные задачи. В результате пока не выполз из первой главы. Как-то хардкорно.
>>684167 Я давно собирался вбросить решение, но через memoize! работало долго, уже k=100 считало секунд 10, а 200 считало бы час или полтора.
Сперва пилил свою таблицу и свою мемоизацию (и заебся отлаживать), а потом нашел в документации, что memoize! можно размер таблицы прямо указать. И заебашил алиас на него >alias memstep = memoize!(step, 100 100 200);
>>684167 А в твоем коде, ты просто заполняешь этот массив 1 и 0? И потом как то приобразовывается к целому числу? А еще, вот что делает этот кусок кода: return up + down + left + right; Он рекурсивно вызывает эти функции чтоли? Первый раз просто D разбираю.
>>684184 Выше же мне сказали что >>684145 >у тебя массив размера n x m x k — кол-во вариантов добраться до каждой точки используя пути соотв. длины тупо заполняешь его
>>684191 Вроде начинаю понимать, то есть в клетках будет вот эта сумма? return up + down + left + right; А что означет слово auto? В доках не нашел его что то.
>>684195 >то есть в клетках будет вот эта сумма? return up + down + left + right; Да, верно. Каждый вызов ветвится на 4 по сторонам и суммирует результаты (но сперва смотрит, не обсчитывал ли он уже такой вызов).
Когда k=0 - то если мы в искомой клетке - путь верный(1), иначе путь неверный (и нехуй дальше уменьшать k)
>>684196 Анончик, ты охуенен. А как обычные ЯП обходятся без memoize? Оставь свой контакт какой нибудь, если я таки решу эту задачку, и меня возьмут на работу, то подарю любую игру в стиме/ дам на пиво/етц.
>>684205 >А как обычные ЯП обходятся без memoize? В лиспе memoize вроде есть или что то подобное. В обычных ЯП ты - сам себе memoize, и будешь делать это руками. Ну а тут оно просто есть по дефолту. Я просто обожаю дишечку - это как "правильные кресты 2.0"
>и меня возьмут на работу Это что, для собеседования чтоле?
>>684210 Да, ты прав, в кложе есть меморайз попробую на нем сделать. А насчет работы, да я норм собеседование прошел, и в конце спросил, а мы что, строчки разворачивать не будем и попросил что нибудь на алгоритмы. Ну я думал будет что то типа найти в строке кол-во трех подряд идущих символов 'abc'. А мне дали эту залупу.
>>684246 Ну, замени на uint k = 200 и подсунь в конец функции. Мне лень было оформлять это говно, так что все параметры я захардкодил. На сам алгоритм они не влияют, это организационные мелочи.
>>684261 >А если вот это переписывать вручну, то тут нужен будет трехмерный массив? Я, до того как нашел, что memoize можно подсунуть размер хеш-таблицы - охуел от "быстродействия" и пытался напилить свою реализацию.
Я делал одномерный, arr[mnk] c индексацией по формуле.
>>683689 советую участвовать на кодфорсес и топкодер, пригодиться по работе может, а тимус это просто задачник с проверкой, знаю ребят которые прорешали 600-950 на тимусе и имеют на кодфорсес ранг Эксперт, знаю парня который входит в топ 10 на тимусе.
>3026331761191340503770893374595925277055394295450130902271922168548205308642694668236259320332359033488388961148337920 Здравствуйте, господин работодатель! Как я вижу вы догадались загуглить число, которое этому - >>683469 оболтусу для тестов. Эта простая мера позволила вам выяснить, что данный кандидат склонен к обману, а также с большой вероятностью - наркоман и извращенец (в этом легко убедиться если заглянуть в другие разделы этого форума). Могу только поапплодировать вашей преусмотрительности!
>>684343 Можно сделать производительнее, если рассматривать движения по x и по y отдельно. Я нафигачил свой proof of concept, но есть расхождение с ответом после 8 знака, и переполняет стек на ideone. Надо бы переписать на явное динамическое программирование. https://ideone.com/XZPGR5
>>684359 Поскольку никакой гугл, микрософт или еще какая хуйня ее не пиарит - она не знаменита.
Вообще, язык, который должен был сделать с++ "с нуля" и избавить его от недостатков. Язык охуенен и я от него тащусь и ссу кипятком, собсно язык моей мечты. Но вакансий по нему нет.
>>684362 >Кстати тут непонятно, используется ли в координатах нумерация с 0 или 1. Вот кстати, где то тут я и проебался, пока особо не искал. Мой ответ сходится только на первые 27 цифр. Или надо чего-то поправить и найти, или исходное число само с опечаткой.
>>684368 Любых. Возьми любое говно из крестов, которое бесит - и тут ты его не найдешь.
Например, тут нормальные шаблоны, я их просто беру и пишу (а в крестах ниасилил). Тут нормальные строки, а не 9000 велосипедов. Тут нормальная блять стандартная библиотека (что заметно, для этого примера я просто заюзал мемоизацию и длинную арифметику, а не велосипедил их). Особо охуенные тут слайсы, аналогов в других языках не видел.
По сути, основная идея такова - язык быстрый и нативный, есть сборщик мусора, но возможность пердолиться с указателями никто не отбирал.
Есть указатели, есть маллок и фри, в стандартной библиотеке есть и весь сишный апи. И вообще она спокойно юзает либы от крестов и си.
>>684381 Я нихуя не знаю из вышеперечисленного, ибо школьник. А так ли это важно, что есть в стандартной библиотеке? Нельзя что-ли не стандартную библиотеку с длинкой подключить?
Но когда нормальная стандартная библиотека - ты просто решаешь задачу и занимаешься ей, а не еблей с языком. Вон, сколько у крестов строк? сишные ака "хуйня из указателей" - раз, std::string - два, QString - три, вроде в OpenCV тоже что то было... Заебывает, честно.
>>684357 >Можно сделать производительнее Ну, не знаю как запустить грувипрогу на своем компе. Но на моем пример с оповскими данными у меня считается меньше секунды при ограничении в 5 секунд. >но есть расхождение с ответом после 8 знака У меня первые 27 сходятся. ХЗ, почему не все - вроде должно быть все правильно. >и переполняет стек на ideone Я как то логарифм от факториала пытался на жабе посчитать и охуел - жаба то, в отличии от дишечки, не оптимизирует хвостовую рекурсию, и на 15000 вроде у меня тоже стек распатронило на ровном месте.
>>684478 Если на пальцах - есть минимальное число ходов, требуемое чтобы из (x0, y0) прибыть в (x1, y1), и есть некоторый излишек. Рассматриваем все варианты распределения этого излишка между ходами по горизонтали и вертикали. Для каждого считаем количество вариантов. Результаты суммируем.
Как считаем: Допустим ходов по горизонтали X, а по ветикали Y. X + Y = k. Рассматриваем одномерную задачу для x: сколько есть способов добраться из x0 в x1, не выходя за пределы [0..M-1]. Рассматриваем одномерную задачу для y: сколько есть способов добраться из y0 в y1, не выходя за пределы [0..N-1]. Посчитали? Отлично. Остаётся посчитать, сколько есть вариантов соединения одного с другим для получение уникальных путей в 2d сетке. Впихнуть в последовательность из k ходов X горизонтальных ходов без учёта порядка можно C(X, k) способами. Результат = горизонтальное x вертикальное x С(X, k).
>>684664 Форкнул - https://ideone.com/2YW0d1 Получил результат 3026331761191340503770893373029273844677591368122716618704642247067326254159330908652193057324457123166746681628950720 Всё ещё не сходится с 3026331761191340503770893372888058869422738484032331390788387569021838371831280294822254761283098828539404148603710720
>>684668 Расслабься. У источника данных вообще 3026331761191340503770893374595925277055394295450130902271922168548205308642694668236259320332359033488388961148337920.
И у тебя, и у меня с ним сходятся только первые 27 цифр.
Такое ощущение, что везде реализация BigInt - сродни флоатам и накапливает какую-то погрешность.
>>684670 >У меня мир рушится, а ты говоришь расслабся?! Как мы заметили, на абсолютно одинаковом алгоритме могут быть отличия в цифрах. И твой, и мой сходится с тестовым на первые 27 цифр (причем мой сходится ближе, азаза).
Вывод1: как минимум 1 из наших ответов неверен. Вывод2: оповское тестовое значение также может быть неверным.
Поскольку алгоритм явно одинаков, сколько там получилось - не столь важно (один хуй с таким числом - столько атомов во вселенной не наберется)
>>684683 Ты замерял время старта JVM. Юзай println System.currentTimeMillis() ... println System.currentTimeMillis() Но вообще оно и должно быть медленнее на одинаковых алгоритмах. Типизация то типическая.
Надо будет с утреца заняться хуйней и попробовать переписать это на чистом лишпе. Там, если вики не пиздит, и мемоизация встроена, и числа - длинные по дефолту.
Интересно, какой там результат будет, лишпу все таки несколько десятилетий и ему я доверяю.
>>684713 Моя первая прога на Хаскелле. Прям чувствую, как передо мной распахнулся мир пандорических захватов, монадических трансформеров в категории эндофункторов, кластеров метапарадигм, зигохистоморфных препроморфизмов наконец.
>>684672 >Вывод2: оповское тестовое значение также может быть неверным. Возможен и такой вариант, так как у меня точно такое же значение как и у вас получается
>>684890 Смотря что у тебя с математикой. Если в вузе получал пятёрки, то можно. Сначала надо прорешать стандартные задачки по дискретной математике. Сделать обязательные мелочи типа перевода между произвольными системами счисления и генерации чисел-палиндромов. Не помешает самому написать длинную арифметику. Вникнуть в трюки с побитовыми операциями, тут подойдёт http://www.hackersdelight.org/ Сделать поиск анаграмм методом "с размахиванием руками". Потом пишешь решето Эратосфена и факторизацию чисел, задачки на линейное программирование (начни с задачи о том, сколькими способами можно разменять энную сумму заданными купюрами). Обход графа в глубину и в ширину, поиск кратчайшего пути, минимизация потока. Всё это для графов, представленных разными структурами данных. Пишешь решалку судоку и непобедимый алгоритм для крестиков-ноликов миимаксом. Проникаешься основными формулами комбинаторики, пишешь свою небольшую либу для получения всех сочетаний, перестановок и размещений для заданного множества. Особое внимание уделяешь рекуррентным формулам для возведения в степень n, вычисления чисел Фибоначчи и Каталана, коэффициентов бинома Ньютона. Задачка Иосифа-Флавия сюда же. Теория чисел нужна на уровне алгоритма Эвклида, генерации пифагоровых троек, формул для "многоугольных" чисел, сумм полиномов для аргументов от 1 до N, нахождения периода десятичной дроби, полученной в результате деления двух чисел и наоборот.
>>685148 26 лет. Никаких достижений тащемта нет. В шараге где я учился никто подготовкой олимпиадников не занимался. Жаль конечно. Это хобби у меня такое - решать головоломки и олимпиадные задачки по программированию. Решённые задачки я складываю в большой чёрный пакет облачную папочку. За год больше сотни набирается. Когда писал пасту я открыл эту папочку и пробежался по решениям. В пасту включил знания, требуемые для решения типовых задач. Учитывай что это начальный-средний уровень. В этой пасте даже китайской теоремы об остатках нет.
>>685691 Ну хуй знает, я бы наверно навелосипедил ещё один двусвязный список, в котором хранил бы ссылки на каждый скажем 300-й элемент основного. И апдейтил бы его хвост после каждого эвента. Или можно сделать по-другому. Держать значения в массиве, отдельно мапу для добавляемых значений и таблицу поправок вида "начиная с 12345-го индекса индексы занижены на 1" Когда таблица будет слишком разрастаться, создавать новый массив со всеми поправками и добавлениями. Если писать на сишке вполне можно и уложиться в секунду.
>>685713 Подумал немного над этим велосипедом... Можно сделать лучше. Не привязываться жёстко к каждому k-му элементу, а просто хранить лист структур (указатель на начало диапазона, количество элементов в диапазоне). Если диапазон слишком разрастается - дробить его на 2, стал слишком маленьким - соединять с соседом (и сразу дробить на 2, если получился переросток). Ничто не мешает сделать эту индексную систему многоуровневой. Жопой чую, что можно добиться логарифмического времени доступа в худшем случае. Надо будет внимательно посмотреть на худшие случаи с переполнениями и недонаполнениями, задевающими сразу все уровни. Получается эдакое дерево, упавшее на бок и попиленное лесорубами.
>>685716 >декартку ниасилил причем тут декартово дерево
в моем понимании, для каждого узла будет {кол-во элементов в левом поддереве, сумма квадратов длин листьев (= сумме этого элемента левого и правого поддеревьев), высота (для балансировки)}
>>686431 Я когда увидел рейтинги топов на кодефорсес долго истерически смеялся. Они заявляют, что их система рейтинга подобна ЭЛО. В шашках, шахматах, и тому подобном говне топовые игроки имеют ЭЛО рейтинг 2500-2700. А тут 3850. Пиздец.
Посаны, подскажите. Бинарный поиск работает по отсортированным массивам. А можно написать вменяемый бинарный поиск через рекурсию который работает и с развернутыми массивами? Допустим, есть [1,2,3..n] как arr и возможен также [100,99,98..n] как аргумент, надо чтобы нашло индекс в обоих случая.
Конечно проверить в тупую массив и написать две ветки через if я додумался, но может есть какое-нибудь более элегантное решение, чтобы не городить лишнюю кучу кода? нюфак в этих ваших алгоритмах и задачках
>>688701 Ничего. Потом я пошел в вузик. Но вузиковскую олимпиадку по кокограммированию я засрал, ибо там скорее всего был сговор - по правилам на отбор должен был отводиться час, а нам дали полчаса и по листку бумаги с заданием, которое (как я уже вспомнил на 3м курсе, когда у нас пошла комбинаторика и матстатистика) - вообще не имело ничего общего с программированием, а по сути это была формула из комбинаторики. Ну, разве что реализовать "функцию факториала" для нее, лол.
После вузика 2 года поработал, заебало, уволился, сычую.
>>688705 тебе 24? какие планы сейчас, гугл код джэм будешь пытаться? я вообще в школе не знал о программировании, хотя на олимпиадах по матеше уделывал парня который сейчас уже и гугле и фейсбуках поработал
>>689046 >тебе 24? Да. Скоро 25. >какие планы сейчас Никаких. Попроебываюсь, поучу алгоритмы (работал погромистом, но по образованию я инженегр и самоучка - так что теоретические основы у меня хромают). Права получу, пузо сброшу, ремонт сделаю, отдохну нормально.
Не олимпиадная задача, но вы тут любите алгоритмы подрочить, так что спрошу. Есть набор точек вида (широта;долгота). Нужно придумать как находить точку в этом наборе, ближайшую к заданной (не из набора), быстрее, чем за линейное время. Например, есть координаты всех макдональдсов, и нужно найти ближайший к юзеру, даже если юзер посреди Антарктиды.
Для плоскости есть quadtree, а вот как сделать что-то подобное для сферы - ума не приложу.
>>691179 Ну представь, что твой шарик - это прямоугольник. Развертку глобуса не видел? Ну, будут куски не одинакового размера - и поебать, все равно в антарктиде макдональсов не шибко много.
>>691181 Не катит. Макдональдсы только для примера. Если бы такое решение подходило - взял бы геохеш и не парился. Но, во-первых, в полярных широтах размер кусков сильно отличается от экватора, во-вторых, кратчайшее расстояние вообще может идти через полюс и развертка отсасывает.
>>691198 Чем блять не катит? Нарезаем шарик на куски, каждую точку пихаем в соответствующий кусок. Итого - чтобы искать ближайшую мы перебираем расстояния только точек в текущем куске, а не на всем шарике. Куски можно делать многоуровневыми - большой кусок включает в себя куски поменьше и так далее - получится сорт оф дерево.
Не сомневаюсь, карты ИРЛ как-то похоже и работают.
Посмотри на карту. Что ближе всего к Хельсинки: Улан-Батор, Анадырь или Нью Йорк? По развертке хуй скажешь, что Анадырь.
Карты работают в самом деле так, но только потому, что подобные задачи на практике всегда ограничены относительно небольшой территорией, в рамках которой кривизной Земли можно пренебречь.
>>691214 >что подобные задачи на практике всегда ограничены относительно небольшой территорией, в рамках которой кривизной Земли можно пренебречь. Ну вот - а в твоем случае разве не так? Что у тебя за задача такая?
>>691219 Нет, в моем нельзя, решение должно работать для всей Земли. Задача с авиацией связана. Сейчас работает полным перебором, но банально интересно найти оптимальное решение для общего случая.
>>691176 >Для плоскости есть quadtree, а вот как сделать что-то подобное для сферы - ума не приложу. Да точно такое же рекурсивное разбиение пространства. Наиболее безгеморройный способ - взять octtree и отобразить широту и долготу в [x;y;z] на сфере, так как минимальное расстояние по поверхности сферы будет соответствовать минимальному же расстоянию по хорде.
>>691244 > минимальное расстояние по поверхности сферы будет соответствовать минимальному же расстоянию по хорде Не подумал об этом. Ты прав, это выглядит как самое простое решение. Спасибо.
>>696330 Наверное нужно начинать просмотр с первого элемента, если он не равен искомому то потом смотреть второй, потом четвертый, потом восьмой - пока не получим элемент больший искомого, и дальше бинарный поиск на последнем отрезке.
Расскажите про Кодефорсес. Когда там контесты? Там всегда правила, что сначала задача больше баллов стоит, чем потом? Насколько сложные задачи? Какой рейтинг там -- ето крута?
>>696738 Контесты на главной странице вывешиваются объявы, бывает что несколько за неделю. Про баллы не очень понятно, я сам не умею решать, но видел как в разные контесты у человека вычиталось за 2 решенные из пяти, а в другой контест например за 2 решенные прибавлялось. Еще вычитают если ты одну задачу несколько раз отсылаешь неверное решение. Крутой рейтинг начинается думаю с Эксперта. Ниже Специалиста наверно зашквар.
Я ньюфаг, записался в ВУЗе на курсы, щас тренируют на acmp, говорят, что потом нужно на Тимус с Кодфорсами переходить. И у меня возник вопрос: какова сложность задач на олимпиадах (на том же acm) по сравнению с acmp? Если я решаю на acmp задачи сложности 30-40% это же все хуйня по сравнению с олимпиадами?
>>704503 Формально нет, а так любое дерево с операциями над подотрезками: дерево отрезков, декартово дерево и тд. Уменьшают за логарифм, используются когда тебе надо сначала провести много операций и потом вывести ответ. Один элемент берётся за логарифм.
Также есть более простая штука, sqrt-декомпозиция, как бы дерево всего с 2 уровнями, соответственно по sqrt(n) потомков в вершине. Принцип тот же самый, что и выше, только изменение отрезка работает за корень, элемент берётся за единицу -> можно часто брать отдельные элементы.
Вот, например, задача на КФ. Вчера начал решать, сделал через рекурсию, но то и дело ловил WA и потом TLE. Через часов 5 сдался, спиздил решение у красного. Но чтобы только понять его решение, потратил час. Сейчас проснулся и пытаюсь по памяти воспроизвести его алгоритм (пока WA). Вот скажите, как можно сразу учитывать все corner-кейсы и ебашить идеальное решение?
>>705052 И за линию окном никак. Отсечешь правую часть, а она может входить в решение, и наоборот. То есть надо делать два слайса: [left, right-1] и [left+1, right]. Рекурсия даже с сохранением значений не прошла.
>>705060 Непонятно, там же по идее надо жадно брать возрастающие элементы, как только встретится невозрастающий, запоминаешь его. Дальше, когда встретится следующий невозрастающий, то смотришь, что уже получилось и обрезаешь по первому невозрастающему, ну там около него. Разве не так? Там несколько случаев, правда, получается, какой из элементов увеличивать/уменьшать, но вроде вполне реализуемо.
>>705060 Находишь в массиве все возрастающие отрезки, включая участки длины 1. Заносишь их границы в список вида [[1,3], [4,4], [5,10], [11,12], [12,12], ...] Проходишься по списку отрезков, проверяя, можно ли склеить текущий отрезок с последующим изменением последнего элемента текущего отрезка, или первого элемента следующего. Если следующий отрезок имеет длину 1, то надо также проверить, можно ли его изменить так, чтобы склеить текущий отрезок со следующими двумя. После каждого удачного склеивания проапдейтишьь максимальную длину.
>>705084 >Если следующий отрезок имеет длину 1, то надо также проверить, можно ли его изменить так, чтобы склеить текущий отрезок со следующими двумя. Это не надо, затупил чёт.
>>705084 Дьявол в деталях. Имеем массив [1, 3, 4, 3, 4]. Два возрастающих отрезка - [1,3,4], [3,4]. По твоей логике, изменив [1,3,4] на [1,3,2], его можно будет склеить с [3,4] и получить [1,3,2,3,4] длиной 5.
>>705116 Вроде нормально. Попробуй заслать полное решение. И потом скажи, смог бы ты без подсказок сразу написать идеальное решение, прошедшее бы с первого раза. Задача, судя по рейтингу А, легкая. Но вот как замечать такие штуки, это ппц. После часов отладки они уже бросаются в глаза, но не сразу же. По идее она должна решаться за 5 минут.
>>705134 Решение красного было примерно таким: завел 2 вектора, в одном хранил числа, в другом - индексы предыдущих фейлов. Потом для каждого i смотрел предыдущий и предпредыдущий фейлы. И в зависимости от проверки вроде той, что выше, выбирал нужный отрезок от i до первого или второго фейла и обновлял максимум.
>>705108 В смысле, понятно, что так делать не надо. Тебе надо хранить текущий уровень, а не просто смотреть на предыдущий элемент, тогда тебя стопорнёт ещё на 5 элементе.
>>705390 Да, была, не на продвинутом уровне, конечно. Просто примерное представление о зависимости времени работы от входных параметров. Вот когда после 10 класса нам рассказывали доказательство времени работы суффиксного автомата, это было трудно, да.
Школьный бал
Во время проведения школьного бала планируется запустить m одинаковых воздушных шариков. Наполнить их воздухом согласились n старшеклассников с различной силой духа и выносливостью. Известно, что i-ый участник процесса наполняет один шарик воздухом за ai минут, причем каждый раз после надувания bi шариков отдыхает и переводит дух ci минут (i = 1..n). Нужно узнать за какое минимальное время (в минутах) будут надуты все шарики при оптимальной работе всех участников.