• Как исправить данный алгоритм?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Определитесь со смыслом start и finish. start - это первый элемент интервала, в котором искомый x может быть. finish, судя по тому, что он равен сначала len(lst) - это за концом интервала (не входит в него).

    Значит, исходя из этого, надо цикл гнать пока start < finish - тут правильно.

    При переходе наверх надо start делать mid+1 - тут правильно.

    При переходе вниз надо finish делать mid - тут ошибка! Ведь только что рассмотренный элемент вы выбрасываете, раз он не подошел. Но предыдущий за ним может быть искомым. Нельзя делать finish = mid-1 - вы теряете потенциально важный элемент.

    Другой вариант исправления - изменить смысл finish быть концом отрезка включительно. Тогда присвоения в цикле правильные, но неверно условие цикла и инициализация. Нужно гнать цекл пока start <= finish и изначально присваивать len(lst)-1.
    Ответ написан
  • Как реализовать такой алгоритм?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Можно генерировать поле "с конца". Что в итоге должно получиться? Очень большое число? Вот и начинайте с него. Скажем, 20. Нужно поэксперементировать - чем больше число, тем более плотно заполнено начальное поле будет.

    Берете случайное число на поле, вокруг которого есть 2 свободных клетки. Растраивайте его на три меньших - убираете случайным образом одно из этих трех чисел. Если в результате на поле остается 3 одинаковых числа рядом, то этот ход был невозможным. Проверять достаточно только последние добавленные 2 числа. Запоминайте, какого типа было число - это и будет "случайным" сгенерированным числом.
    Ответ написан
    Комментировать
  • Как решить эту задачу динамическое программирование?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это стандартное упражнение на ДП.

    F(i,j) - максимальное количество монет, которые можно собрать придя в точку (i, j).

    F(0,0) = Z[0,0]
    F(i,j) = Z[i,j] + max(F(i-1,j), F(i,j-1))
    F(-1,*) = F(*,-1) = -100500
    ответ - F(n,m)

    Для восстановления пути сохраняйте в каждой ячейке, с какой стороны взят максимум - сверху или слева. И разворачивайте ответ с конца по этим ссылкам.
    Ответ написан
    1 комментарий
  • Зачем ставить номера портов источника и назначения в ТСР в самом начале заголовка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    У TCP для идентификации соединения используются адреса отправителя, получателя и порты отравителя и получателя.

    Соотвтественно, операционной системе или кто там пакеты обрабатывает надо понять, кому этот пакет отправлять. Для этого надо посмотреть на адреса и порты. Поэтому порты идут в начале по фиксированному смещению. Чтобы не искать их по всему пакету.
    Ответ написан
    4 комментария
  • Как составить формулу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    M%p = 0, значит M=k*p для какого-то целого k.

    k*p >= N, значит k >= N/p.

    k - целое, а справа в неравенстве может быть вещественное число. Раз k должно быть больше, то можно вещественное число округлить вверх.

    k >= ceil(N/p).

    слева и справа целые числа, надо найти минимальное k, значит k = ceil(N/p).

    Отсюда весь ответ M = p*ceil(N/p)

    ceil(N/p) можно подсчитать в целых числах в C, как (N+p-1)/p

    Еще, если подумать, что вам нужно блищайшее делящееся на p число, то нужно дополнить N%p до p, то можно сделать так: N+(N%p ? p-N%p : 0)
    Ответ написан
    2 комментария
  • Как провалидировать ход коня?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Попробуйте проверять, что средний символ "-".
    Еще надо проверять, что длина строки ровно 5 символов.
    Ответ написан
  • Как вывести Среднее арифметическое через функцию?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    У вас переменная s локальная в main(), а вы ее в A() используете.

    Сделайте A() возвращающей среднее (и это должен быть не int а float). Заведите переменную для суммы внутри A. А функция PrintS() должна будет принимать это среднее для печати. А то и вообще удалите PrintS - функция для одной операции вывода несет мало смысла.
    Ответ написан
    Комментировать
  • Сумма элементов массива, больших среднего - С++ Как решить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Судя по условию, надо считать среднее арифметическое, а вы ищите медиану.

    Надо вместо сортировки тупо просуммировать все числа и поделить на их количество (округлите вниз).

    Ну и, не забудьте в конце цикл гнать по всем элементам а не от середины.
    Ответ написан
    1 комментарий
  • Как решить эту задачу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Представьте, что ваши вершины лежат на прямой OX в координатах (a_i, 0). Длины ребер тут будут тупо длинами отрезков. Теперь ваша задача обойти все точки на прямой и вернутся в начало, пройдя наименьшее расстояние.

    Очевидно, что оптимальное решение тут, например, такое: начните в самой левой точке и идите по ним слева-направо. Дойдя до конца, вернитесь в самую левую точку. Это и будет оптимальное решение. Длина пути тут 2*(max(ai)-min(ai)).

    Если нужна только длина пути - то можно тупо найти минимум и максимум и взять удвоенную разность. Если нужен сам путь, то сортируйте или пары {a_i, i} или сортируйте только индексы, используя собственную функцию сравнения, которая по двум целым числам сравнивает a[i1] и a[i2].
    Ответ написан
    1 комментарий
  • Почти любой алгоритм, можно немного изменить, радикально уменьшив время его работы в лучшем случае. Как?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Да, просто отдельно обработать какой-то случай предподсчитав его. Не обязательно лучший, просто какой-то. В результате этот случай станет лучшим и время его работы будет линейным (надо же сравнить входные данные).

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

    Есть, правда спецэффекты, когда можно проверять только часть входных данных. Например для бинпоиска в массиве можно сравнить искомый элемент с первыми двумя, и найти ответ, если искомый элемент лежит где-то между ними.

    Но, например, алгоритм суммирования всех чисел в массиве или поиска минимума вы так не ускорите.
    Ответ написан
  • Приложение VS code не видит класс ofstream из библиотеки fstream. Что делать?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Пальцем в небо... Но вы обращаетесь через std::ofstream или используете using namespace std;?
    Ответ написан
  • Как определить положение круга на координатной плоскости?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Рассмотрите варианты. Что значит, что круг касается одной четверти? Значит он не пересекается ни с одной из осей координат, т.е. самая нижняя точка круга выше OX, или самая верхняя ниже OX и аналогично для OY.
    Может ли круг касаться двух четвертей? Запросто. Если исключить первый случай сначала, то получится, что круг должен пересекать ровно одну из осей. Далее, может ли круг касаться трех четвертей? Порисуйте, подумайте, и поймите, что нет (подсказка - круг выпуклая фигура, отрезок между любыми двумя точками в круге целиком лежит в круге). Остается только четвертый вариант. Т.е. если не 1 и не 2 четверти, то точно 4.
    Ответ написан
    Комментировать
  • Python массивы не пашет нужна помощь, что делать?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    У вас массив интов создается:
    massive = array('i', [])

    А пихаете вы туда символ:
    massive.append(random.choice(string.ascii_letters))


    О чем вам интерпретатор и говорит:
    TypeError: an integer is required (got type str)
    Ответ написан
  • Что это такое в решении предела (lim)?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это они просто вынесли за скобки максимальную степень x отдельно в числителе и знаменателе.
    Ответ написан
    Комментировать
  • Как работают классы в Python?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    https://docs.python.org/3/tutorial/classes.html#cl... - инструкции внутри class выполняются один раз.
    Обычно там пишут определения методов и членов класса. Точно так же, как у вас в коде ниже написано определение функции test_def. Определение всегда выполняется.
    Ответ написан
    Комментировать
  • Как составить массив из чётных элементов матрицы на Python?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В заголовке у вас про четные, а в теле задания - плолжительные. Программа как бы ищет четные. Но числа float же, для них четность не имеет смысла. Вам нужно вместо float при вводе приводить к int.

    edit:
    А еще у вас при обходе матрицы только один цикл. А надо так же как при вводе делать двумя вложенными циклами.
    Ответ написан
    Комментировать
  • Как максимально оптимизировать код Python?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Проблема не в коде, а в алгоритме. Долго строить всю строку и считать в ней нули.

    Есть вот такая формула. Для каждого простого числа можно опредерить степень просто деля n (не факториал!) на это простое число нацело, пока не получится 0 и суммировать все результаты.

    Но это работет только для простых чисел. Т.е. чтобы узнать, в какой степени число 10 входит в N! (или сколько нулей на конце в деситичной записи) надо узнать, сколько раз 2 и 5 входят в N! и взять минимум.

    Т.е. надо разложить k на простые множители, для каждого простого множителя подсчитать, сколько раз он входит в n! по формле выше. Потом поделить это на степень простого числа в k, и по всем делителям k взять минимум.
    Ответ написан
    Комментировать
  • Как разложить полигон на дерево вершин?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Похоже автор напутал. Слышал где-то про логарифмический алгоритм, знает, что за логарифм обычно работают сбалансированные бинарные деревья, вот и связал это воедино.

    В случае с трассировкой лучей, за логарифм нет реализации вообще - ибо у невыпуклого многоугольника может быть O(n) пересечений с лучем (представьте себе пилу).

    В случае с ближайшей точкой - если и есть структура, то это то-то вроде trapezoidal map - это такая мозговыносящая штука, что не советую о ней даже думать. Нужно разбить пространство на области, ближайшие к каждой стороне.

    За логарифм есть решение через бинарный поиск.
    Разбейте пространство на вертикальные колонны всеми x координатами всех вершин многоугольника. Внутри каждой из них будет проходить четное количество сторон. Составьте для каждой стороны уравнение и отсортируйте их по высоте.

    При запросе, сначала бинпоиском найдите, в какой колонне лежит точка. Потом еще одним бинпоиском найдите, между какими из двух прямых лежит точка. Тут сравнения будут уже непросто чисел, а надо будет подставлять точку в уравнения прямых и смотреть, лежит ли точка выше или ниже. Если точка лежит так, что выше ее (и ниже) нечетное количество прямых - то точка внутри.

    Проблема этого метода, что он требует O(n^2) памяти в худшем случае и такую же предобработку.
    Но, для выпуклых многоугольников, прямых в каждой колонне будет всего две. Вот описание метода с реализацией для этого упрощенного случая.
    Ответ написан
    1 комментарий
  • Как разложить число на множители(си)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Не получается остановиться только на двух множителях.


    Приведите ваш код, который не останавливается. По идее, достаточно в него вставить return после нахождения первой пары множителей.
    Ответ написан
  • Как выразить динамику набора данных одним числом?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Возьмите для каждого товара набор точек {день, показатель} за сколько-то последних дней. Постройте линейную регрессию. Наклон прямой (т.е. коэффициент перед номером дня) и будет этим показателем динамики.
    Ответ написан
    Комментировать