impelix, Ну, в самом начале можно сделать любой шаг. А в x надо считать сумму всех выведенных run. Грубо говоря cout << "run " << m - x%m << "\n"; x += m - x%m;
Так же, в случае, когда floor(x/m) != k можно сдвинуть границу не выводя никаких команд.
Еще надо очень аккуратно со смыслом l и r. Это границы которые искомая величина может принять? тогда в случае, если вы знаете, что m < ответа, надо присваивать l = m+1;. Если вы поняли, что ответ может быть и m, то надо присваивать без 1.
Еще аккуратно посмотрите случай l==r-1: а не зависнет ли программа? Она потом спросит про l, но может ли прийти к выводу, что ответ >= m и не сдвинуть границы?
Edit: и да, в k надо накапливать сумму всех ответов от системы, а не последний ответ. Суммарное количество оборотов.
Тут только проблема в том, что последующие команды run k вы выполняете не с начала круга, а уже с накопленным пробегом. Так что можно перескочить за фишиш даже сделав шаг короче длины круга.
impelix, охохо! ni <= 10^18. Вот вы столько цифр пытались запихать в массив. Конечно, оно падает по памяти, тут нужны миллионы терабайт. Да, надо складывать, как я написал в последнем комментарии: группа с группой.
impelix, А дайте задачу целиком. Что там за ограничения по числам? По памяти и по времени?
Может, надо суммировать не разворачивая вот эти вот группы. Если там дается, скажем, до миллиона групп, но в каждой может быть до миллиона чисел, то вы падаете по памяти еще во время ввода.
Тут надо прочитать пары (цифра, количество), развернуть их списки, а потом суммировать погрупно. Если группы одинакового размера - сложили их. если нет, то откусили от более длинной групы кусок равный более короткой. Обработали. Из-за переноса можно в ответ вписать сразу несколько групп. В ответе в конце надо будет подряд идущие одинаковые группы цифр слить в одну группу. Ну и развернуть перед выводом.
Надо порисовать на бумажке, что будет, если сложить "aa...a", "bb....b" и еще перенос (0 или 1) в правый разряд.
Это потому что вы условие задачи так и не сформулировали. Надо эти ветора подвигать, чтобы сложился многоугольник? Их можно вращать или нет? Можно их расставлять в любом порядке?
Что за ошибку то выдает система? В коде виду 2 ошибки - отсутствие фигурных скобок у else, и все ту же запись за границу массива в цикле. Вы там после всех resize'ов можете получить массив b га один короче массива a. Вы там +1 к length делаете как бы для этого переноса, но цикл суммирования все равно гоните до length-1. Можно прибавлять перенос, если он не 0, тогда выхода за границу нк будет. Но испоавьте код, чтобы массивы были одинаковой длины.
impelix, или заведите отдельный вектор для ответа. Количество пар можно подсчитать перед выводом (считайте различия в массиве отдельным циклом). Цифры можно хранить в char - тоже экономия.
s4q, Надо задать к этому массиву еще и список, между какими двумя центрами можно возить товары. Обычно это только между отделением и родительским ему а так же между любыми двумя отделениями верхнего уровня.
Вы должны задать эти ограничения. По координатам их вывести невозможно, ибо границы областей/поселений нарезаны весьма произвольно. Если вы их не задаете, то ответ остается такой-же: кратчайший путь будет без промежуточных точек, по прямой.
s4q, но тогда кратчайший путь - прямая из начала в конец (скорее всего не посещая ни одну точку).
Судя по обсуждению под ответами, у вас есть важное ограничение - иерархическая структура логистики почтовых отделений. Нельзя из районного отделения новосибираска отправить посылку напрямую в районное отделение в архангельске - слишком много различных путей для посылок будет. Посылка должна идти через городской пункт, через областной в новосибирске, оттуда, скорее всего, через москву в сортировочный центр в арзангельской области.
s4q, Путь должен проходить через промежуточные точки в заданном порядке или как угодно? Надо посетить все промежуточные точки, или можно пропускать их?
Это координаты в мире, т.е. путь строится по дорогам условным google maps? Или дело на плоскости, и можно проводить прямые? В тегах вы указали "графы", может быть у вас есть произвольный граф на котором надо решить задачу?
rPman, Ох, напутал я. Для произведения матриц оно не применимо, но перемножение полиномов, длинных чисел и свертки на матрицах - делаются через FFT. Есть какие-то извращенные алгоритмы вроде этого (страница 31+), но это совсем не то, что я представлял, когда упоминал FFT выше.
HrustHr, Т.е. у вас есть не данное число X, Вы из него вычитаете 4, получаете неизвестное X-4. Дальше что? Как вообще можно из неизвестного числа что-то вычитать? Ну допустим, вы 40 раз вычли, получили X-160. 42 раза вычли, получили X-168 - все неизвестные числа. Как вы определяете, что дальше вычитать не надо?
А почему из 167? Если вы ищете число 167, то его искать не надо, вот оно уже есть: "167". Если же вы знаете, что X от 1 до 167, то вычитать 4 нельзя. А вдруг искомое число 166? Вы его вычитанием 4 пропустите. Если вы можете сказать, что перескочили через искомое X - то это уже и есть тот самый критерий, какое-то дополнительное свойство X, которое можно использовать, например, для бинарного поиска.
HrustHr, вам в прошлый раз пытались объяснить, что мы не телепаты, просто взять и выкинуть из перебора почти все числа - нельзя. Только если вы дадите полное и строгое описание свойств искомого числа X, может быть шанс на какое-то ускорение перебора. Но, если это действительно криптография, то шанса вообще нет.
Rsa97, по-моему, этот кадр уже был здесь несколько месяцев назад с несколькими похожими вопросами. Собственно задачу так и не рассказал ни разу, а только намеками. Чувак явно ломает криптографию и держит в тайне свою гениальную идею.
cout << "run " << m - x%m << "\n"; x += m - x%m;
Так же, в случае, когда floor(x/m) != k можно сдвинуть границу не выводя никаких команд.
Еще надо очень аккуратно со смыслом l и r. Это границы которые искомая величина может принять? тогда в случае, если вы знаете, что m < ответа, надо присваивать
l = m+1;
. Если вы поняли, что ответ может быть и m, то надо присваивать без 1.Еще аккуратно посмотрите случай l==r-1: а не зависнет ли программа? Она потом спросит про l, но может ли прийти к выводу, что ответ >= m и не сдвинуть границы?
Edit: и да, в k надо накапливать сумму всех ответов от системы, а не последний ответ. Суммарное количество оборотов.