• Через какой алгоритм решать эту задачу?

    wataru
    @wataru Куратор тега C++
    Adamos, Ох, да. У вас решение за O(n^2) вместо O(n). Это называется "волновой алгоритм". Тоже из теории графов. Для уже упомянутого выше случая
    в других вариантах было намного больше этажей
    - ваше решение никуда не годится.

    Вообще, математическая модель тут - граф. Вы можете сколько угодно отворачиваться от этого факта, но любое ваше решение в итоге будет алгоритмом на графе. Просто если теорию знать, то сразу понятно, какое решение тут хорошее, а какое - не очень. Это как, если вам дано квадратное уравнение, даже если там не x, а количество зайцев и все словами описано, то вы как его не решайте, в итоге все равно получите числа из формулы с дискриминантом.
  • Через какой алгоритм решать эту задачу?

    wataru
    @wataru Куратор тега C++
    Adamos, Опишите эти ваши списки подробнее, пожалуйста. Я уверен что, если вы доведете ваше решение до рабочего состояния, это будет тот же самый BFS.
  • Через какой алгоритм решать эту задачу?

    wataru
    @wataru Куратор тега C++
    Adamos,
    значит, с рекурсией лучше не рисковать и развернуть ее в цикл.
    Там 2 ветки, удачи ее разворачивать.

    Но вообще, если, таки, составить математическую модель задачи (граф), то это стандартная задача поиска компоненты связности в графе. Решается или обходом в глубину (типа ваша рекурсия и получается, только стандартно. Понятно почему и как работает и доказано), или обходом в ширину (но это не "развернутая в цикл рекурсия". Это другой подход).
  • Через какой алгоритм решать эту задачу?

    wataru
    @wataru Куратор тега C++
    Adamos, Ну нет, граф-то строится элементарно. Он может быть несвязен и задача - найти размер компоненты связности со стартовой вершиной.

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

    Но вообще тут конкретная задача с конкретными ограниченями и нет никаких миллионов этажей - их 70.
  • Что не так с кодом, проверяющим логическую схему?

    wataru
    @wataru Куратор тега C++
    Xiran, 1 << n - это сдвиг числа 1 на n битов влево. Фактически получается возведение 2 в степень n, да.

    Только почему там числа 32-битные со знаком?


    Ну вот у вас там стоит auto слева. А справа у вас | - арифметический оператор. Соответственно, там применяются сложные правила преобразования типов. И результат получается int.
  • Что не так с кодом, проверяющим логическую схему?

    wataru
    @wataru Куратор тега C++
    Xiran, Еще совет: вместо < VARIANTS_COUNT в условии цикла можно написать < (1 << INPUT_BITS_COUNT).
  • Объясните как посчитать график отношений RoR?

    wataru
    @wataru
    dnsortorovka, Хорошо, зайдем с другой стороны. Вот у вас дана таблица 6x6. Рисуйте 6 точек с номерами. Если, где в таблице стоит звездочка, то рисуйте стрелочку от точки с номером строки к точке с номером столбца.

    Так, в примере есть стрелочка из 1 в 3, 5 и 6. Из 2 только в 1.

    Потом заполняете таблицу ответ. В каждой ячейке, если есть стрелочка между точкой с номером строки и точкой с номером столбца - ставите звездочку. Так же, если есть цепочка из двух стрелочек - тоже соединяете. Также мы ставим стрелочку в третьем столбце, потому что есть цепочка 2->1->3. Поэтому во второй строке третья ячейка заполняется. Так же для ячеек 5 и 6.

    Так, во второй строке ответа, мы ставим звездочку в первую ячейку, потому что есть стрелочка 2->1.
  • Объясните как посчитать график отношений RoR?

    wataru
    @wataru
    dnsortorovka, Ну, руками также просто. Во-первых, скопируйте звездочки из ячеек, где они уже стоят. Потом берете каждую строку, смотрите, где там стоят звездочки, в каких столбцах, и копируете строку с этим номером в ответ, ставя звездочки, где их еще нет. Вот первая строка в ответе: там стоят звездочки в столбцах 3,5,6, потому что в R они там есть. Потом, втретьей строке есть звездочки в столбцах 1,2,5, в пятой строке - 2,4,5,6, в шестой строке в столбце 1. В итоге ставим звездочки в столбцах 3,5,6,1,2,5,2,4,5,6 - покрывая все ячейки в первой строке. А во второй строке: столбец 1 стоит, потому что он есть в R. Первая строка содержит звездочки в столбцах 3,5,6 - ставим их тоже.
  • Почему умножение матрицы 8x8 медленнее чем 10x10?

    wataru
    @wataru Куратор тега C++
    Dyikot, Одна вещь логична: создание потоков сильно более тяжелая операция чем перемножение матриц, поэтому вариант с 4 потоками в ~4 раза медленнее.

    Разница между 8x8 и 10x10 все еще укладывается впогрешность. Гоняйте тест 100000 или лучше миллион раз.

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

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

    Попробуйте еще, например, транспонировать вторую матрицу - измените код умножения так, чтобы он по второй матрице тоже шел по строкам, а не по столбцам. Возможно странность исчезнет.
  • Как это решать?

    wataru
    @wataru Куратор тега Алгоритмы
    Alexandroppolus, Вообще, да, странное у вас ДП. По идее, ДП должно быть двумерное: F(sum, k) - минимальное количество монет, чтобы собрать сумму sum, используя первые k монет (где все монеты имеют по 2 копии и можно их использовать только по одному разу). Это стандартное ДП и можно хранить только одну строчку, если пересчитывать ее с конца: dp[i] = min(dp[i], dp[i-coin_value]). Но тогда цикл по монеткам должен быть внешним.

    У вас же параметр только один, а использованные монеты засунуты в возвращаемое значение. Так делать нельзя. Любое состояние, влияющее на ответ должно быть в параметрах, а не в вычисляемом значении.
    Указанная вами проблема действительно существует. При чем, не надо чтобы единственным предшественником был dp[sum-k]. Достаточно, чтобы по всем возможным оптимальным предшественникам нужная монета была использованна дважды.

    Я тоже пока тест придумать не могу, но пока алгоритм не доказан - он должен считаться неправильным. Ваш алгоритм не является ДП как таковым, ибо по указанной проблеме, нельзя решать задачу для n через n-k: Ибо оптимальное решение для подзадачи не гарантирует оптимальное решение для текущей задачи. Так что его надо как-то по-другому доказывать.

    Можно попробовать стресс тест написать с нормальным ДП или перебором: Авось рандом тест найдет.
  • Как решить задание без использования правила Лопиталя?

    wataru
    @wataru
    Lastochka17, сначала по двойному углу раскрыли. Получили sin(3x)cos(3x). Синус там в ноль не обращается в пределе, его не трогаем. cos(3x) раскладываем в (4сos^2(x)-3)cos(x). cos(x) опять не трогаем, косинус в квадрате заменяем на 1-sin^2. 1-4sin^2(x) остается. Раскрываем по формуле разности квадратов и получаем в одном из множетелей -числитель. Оно-то и сокращается.
  • Почему недоступны приватные поля для дружественного метода?

    wataru
    @wataru Куратор тега C++
    forIXsins, Может вы что-то не так сделали. Или чел тупит. По-моему и 6 лет назад так делать было нельзя тоже.
  • Возникает ошибка, но не знаю какая?

    wataru
    @wataru Куратор тега Алгоритмы
    HedgeHog1234, и сколько они там памяти потребляли? Пишут ли там, сколько памяти было в тестах, которые упали? Вы уверены, что попытка выделить больше допустимого памяти будет учтена в этой статичтике как высокое потребление, а не, допустим, прошрамма будет прибита еще при попытке эту память съесть?

    Вообще, я как специалист вам утверждаю: в этом точно есть ошибка. Это решение задачи не правильное, тут нужен перебор, а не ДП.
  • Возникает ошибка, но не знаю какая?

    wataru
    @wataru Куратор тега Алгоритмы
    HedgeHog1234, Этого не может быть. Вы точно запустили с суммой и монетами примерно в 1000000000? Оно что-то вывело? Обратите внимание, надо чтобы монеты тоже были большие, иначе программа выведет -1 не создавая очень большого массива.
  • Возникает ошибка, но не знаю какая?

    wataru
    @wataru Куратор тега Алгоритмы
    HedgeHog1234, я про них и говорю. Там вряд ли 109, это 10^9. Я уверен, оно на таком большом тесте и падает с ошибкой.
  • Как это решать?

    wataru
    @wataru Куратор тега Алгоритмы
    Там ограничения: сумма до миллиарда, 15 типов монет. Это ДП тут не подходит.
  • Модель F(x) с разрывом типа «скачок»?

    wataru
    @wataru Куратор тега Математика
    floppa322, Легко - пьяный машинист случайно нажимает на тормоз/ускорение.
  • Где ошибка в коде?

    wataru
    @wataru Куратор тега C++
    Ну вы добавьте отладочный вывод, если не умеете отладчиком пользоваться. Перед циклом выведите содержимое строки buf. В цикле выводите istr2.
  • Почему в .txt файле на Linux появляется "лишний" байт?

    wataru
    @wataru
    Borankin, Ага, т.е. вы в каком-то редакторе вводите символ и сохраняете файл. Что за редактор? Даже если вы используете одну и ту же программу (например, notepad++), вот вообще не факт, что она ведет себя одинаково в разных системах.

    Раз уж вы в линуксе, запустите команду `xxd 1.txt` в консоли и приведите ее вывод. Оно выведет файл в 16-ричном формате - там сразу станет видно, что это за 2 байта.