Задать вопрос
  • Нахождение определенного интеграла модуля косинуса?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что вот эта вот ваша формула - она работает только на отрезке, где sinx*sgn(cos x) непрерывна. А она имеет разрывы в точках, где косинус меняет знак. Вы ее, видимо, подобрали методом тыка. И действительно, если взять ее производную в каждой точке, то получается |cos x|. Но эту производную не взять в точках, где косинус меняет знак, ведь там разрывы. Это не первообразная, хотя бы потому, что первообразная должна быть непрерывна. поэтому формула определенного интегралла тут и не работает.
    Ответ написан
    2 комментария
  • Как имитировать разрыв вершин графа?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо или удалять из графа вершину, или помечать ее удаленной и в вашем алгоритме поиска пути просто пропускать такие помеченные вершины во всех циклах по вершинам.
    Ответ написан
    Комментировать
  • Является ли хорошим решением разбивать большой класс на несколько .cpp файлов (C++)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это очень плохая идея. Теперь пользователю придется искать функцию в 5 файлах, потому что она может быть в любом из них. Если же куски класса можно как-то логически сгруппировать, то надо разбить сам класс на несколько более мелких. Вынести часть функционала в вспомогательные классы или даже тупо функции.

    Большой файл - гораздо менее вредно, чем нелогичная файловая структура проекта. Вот большие функции и класс с излишне большой ответственностью - это плохо. А файл - фигня. Строк от разбивки меньше не становится. Ну придется еще переключатся между файлами - только хуже станет.
    Ответ написан
    Комментировать
  • Как отключить определение функции через шаблоны?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно сделать так:

    template <int a, int b>
    class A {
        public:
        template<bool tmp = true>
        typename std::enable_if<a==b && tmp, int>::type F() {
           return 1;   
        }
    };
    
    ...
    
    A<1,1> a;
    std::cout << a.F();  // OK.
    A<2,100> b;
    std::cout << b.F(); // Ошибка A<2,100> не имеет метода F().


    Мне сложно объяснить, чтобы было понятно, почему работает именно это, но я попробую.

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

    Далее, хотелось бы что бы просто работало вот это:
    template<>
     typename std::enable_if<a==b, int>::type F()

    Тут все понятно, enable_if не имеет type, если a неравно b. Шаблон никак не инстанциировать и метод не должен был бы генерироваться. Но это было бы слишком просто.

    Вместо этого, надо там завести какой-то вообще ненужный как бы параметр шаблона tmp, и обязательно использовать его в enable_if. Это потому что если в этом шаблоне не будет никак использоваться параметр шаблона, то SFINAE не срабатывает, и вылезает ошибка компиляции.
    Ответ написан
  • Будет ли std::swap(vector[0], vector[1]) быстрее, чем vector[1] = vector[0]?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В общем случае - будет.
    std::swap работает за константу:
    Complexity
    1) Constant.


    Присвоение за линию:
    Complexity
    1) Linear in the size of *this and other.


    Edit: это если присваемые штуки - вектора. Или какие-то большие объекты с семантикой перемещения. Если у вас тупо числа, то одно присвоение будет быстрее swap.
    Ответ написан
  • Как с помощью шаблонов проверить, что два числа равны?

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

    template <int a, int b>
    class A {
        public:
        template<bool tmp = true>
        typename std::enable_if<a==b && tmp, int>::type F() {
           return 1;   
        }
    };
    
    ...
    
    A<1,1> a;
    std::cout << a.F();  // OK.
    A<2,100> b;
    std::cout << b.F(); // Ошибка A<2,100> не имеет метода F().


    Мне сложно объяснить, чтобы было понятно, почему работает именно это, но я попробую.

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

    Далее, хотелось бы что бы просто работало вот это:
    template<>
     typename std::enable_if<a==b, int>::type F()

    Тут все понятно, enable_if не имеет type, если a неравно b. Шаблон никак не инстанциировать и метод не должен был бы генерироваться. Но это было бы слишком просто.

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    u ограничена. h стремится к нулю. Поэтому u*h - стремится к нулю.
    Ответ написан
    Комментировать
  • Как дополнить двумерную матрицу нулями по краям?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Сначала каждую строку resize до размера size()+w0+w1. Потом сдвигайте элементы на w0 позиций вправо (цикл надо гнать с конца). Потом заполните пустые места нулями.

    То же самое в самом векторе векторов. Только вместо чисел надо сдвигать вектора на h0 позиций. На пустые места надо будет записывать std::vector(n+w0+w1, 0);

    Edit: А вообще, тут и добавлять в массив ничего не надо. Вы нужный вам ответ можете нулями прямо во время вывода добить.
    Ответ написан
    Комментировать
  • Как разбить объявление класса и его реализацию?

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

    Чтобы это исправить нужно или засунуть все в h файл, или в cpp файле прописать специализации шаблона со всеми типами, которые где-либо еще используются, вот так:
    using A<int>;
    using A<double>;
    // etc


    Далее, как именно и зачем вы хотите этот внутренний класс скрыть?
    Иногда вам может быть достаточно сделать член этого типа private и все. Факт того, что кто-то где-то сможет завести переменную этого типа обычно не является проблемой. Для списка уж точно. Если же это проблема и внутренний класс является friend внешнего и что-то такое делает, что нарушает инкапсуляцию (например при учнитожении, что-то меняет в родительском классе), то просто сделав вложенный класс private, вы ничего не добъетесь. Переменные этого типа все-равно можно будет использовать и к ним обращатся (иногда через хаки). Обычно у внутренних классов просто делают приватным конструктор и нужные методы и прописывают внешний класс как friend. Тогда вы в самом классе сможете переменные этого типа создавать и использовать, но никто снаружи ничего с ним сделать не может.

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Дельта x меньше лямбда по построению. Также, лямбда меньше дельта, так указано в насале строки. Весь этот переход - это замена каждого дельта x на большее его дельта и вынос его за скобки.
    Ответ написан
    Комментировать
  • Как передать list в функцию c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В параметрах функции:
    list ItemsList
    но в другом месте:
    list <int> ItemsList

    list - это шаблон или как?
    Ответ написан
  • Почему базисом для плоскости в трёхмерном пространстве является Null Space?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Плоскость проходит через ноль. Значит вектор-базис в этой плоскости тоже удовлетворяет уравнению (ведь любой вектор в плоскости имеет координаты точки конца - а она на плоскости).

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Окройте файл в ifstream в бинарном режиме и читайте 2 байта через read.

    Или используйте fread. Читайте 2 байта в буфер длинной 2.
    Ответ написан
    Комментировать
  • Рекурсия.По какой причине ответ всегда 0?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Аккуратно расставьте отступы. У вас там логика if else напутана, и программа делает совсем не то, что бы вам хотелось. Кроме того, посмотрите внимательно на warning-и от компилятора (он точно скажет, что power иногда не возвращает никаких значений, хотя вам кажется, что return есть во всех ветках if else). Это как раз потому, что у вас скобки не так расставлены и else относится совсем не к тому if, как вы хотели бы.
    Ответ написан
    Комментировать
  • Зачем в стандартной библиотеке вначале класса объявлены псевдонимы для параметров шаблона?

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

    Во-первых, чтобы можно было к параметру шаблона обращатся в других шаблонах. Вот, вы привели пример с _Сontainer в каком-то итераторе. Можно представить что есть какой-то алгоритм (функция), который принимает итератор и ему там надо будет как-то использовать тип контейнера (или временную переменную завести, или тип возвращаемого значения задать или как-то проверить, что тип контейнера обладает какими-то свойствами).

    При этом алгоритм должен получать и вот этот вот back_insert_iterator и еще десяток других итераторов. Поэтому нельзя тип контейнера вынести в параметр шаблона и указывать его в типе итератора в праметре функции. Вы поищите в исходниках этот самый "_Container" - станет понятно, как оно используется.

    Во-вторых, иногда это делается и для удобства. Ибо в этих шаблонах параметры сами могут быть адски нагроможденными шаблонами.
    Ответ написан
    Комментировать
  • Как сравнить 2 класса с разными шаблонными параметрами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А не проще ли так?
    template <const std::size_t other_columns>
     Matrix<rows, other_columns, T> MultiplyOnMatrix(const Matrix<columns, other_columns, T>& matrix)
    Ответ написан
    1 комментарий
  • Как ускорить код на Python?

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

    Тут есть два решения. Первое - через дерево отрезков с отложенным изменением. Само дерево немного странное получается, потому что оно ничего не считает в промежуточных вершинах, а будет только хранить отложенное изменение. Физический смысл отложенного изменения - "все ячейки в этом поддереве должны быть не меньше этого значения". Релаксация (спуск вниз) отложенного изменения происходит так: отложенное изменение в детях заменяется на максимум из того, что там лежит и отложенного значения в родителе. Значение в родителе заменяется на 0. При запросе спускайтесь рекурсивно по дереву, релаксируя изменения, пока текущее поддерево не будет целиком лежать в запросе. Тогда перезаписывайте отложенное значение в текущей вершине, если оно меньше. В конце обработки запросов релаксируйте все вершины сверху вниз и просуммируйте значения в листьях.

    Второе решение - через метод сканирующей прямой может быть проще в реализации из-за наличия встроенных структур данных. Я думаю, в питоне должна быть структура, которая умеет быстро добавлять число, удалять число и брать максимум из всех чисел. В C++ есть std::set или std::priority_queue.
    Для каждого отрезка-запроса создайте два события вида <координата, отрезок открылся/закрылся, значение> (разберитесь, где там +-1 поставить так, чтобы длина отрезка по координатам равнялась количеству покрытых ячеек). Засуньте их все в один массив и отсортируйте по координате. Потом проходитесь слева-на-право. Применяйте текущее событие - или добавляйте число в вашу структуру данных, или удаляйте оттуда. Между текущим и следующим событием по координатам все ячейки покрыты одним и тем же множеством отрезков, поэтому можно их все быстро посчитать, ведь ваша структура умеет брать максимум. Добавляйте к ответу разность координат между текущим и следующим событиями, умноженную на значение максимума из структуры. Все.
    Ответ написан
    Комментировать
  • Тут же нужно найти матрицу перехода?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Не очень понятно задание, что там за матрицы даны, но в общем случае делается так: найдите матрицу перехода из старых координат в новые. Это будет S^(-1). Чтобы получить преобразование в новом базисе, надо взять координаты, перейти в старый базис, применить перобразование (А) и перейти назад в новый базис. Т.е. ответ - произведение трех матриц: S*A*S^(-1)
    Ответ написан
    Комментировать
  • Я инвалид, проблемы с руками. Возможно ли мне стать программистом? Какие шансы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Возможно. Шансы как у всех. Умение быстро печатать - вообще не критично программистам.
    Большую часть времени вы будете читать и понимать уже написанный код, а также обдумывать структуру ваших программ. Скорость печати на производительность программиста влияет минимально.
    Ответ написан
    2 комментария
  • Как лучше организовать алгоритм подсчета выгоды?

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

    Если бы все промокоды давали процентную скидку, то можно было бы брать жадно, но эти абсолютные коды все ломают. Тут можно посмотреть не решение задачи о рюкзаке или о размене монет (динамическое программирование), похоже это позволит ускорить решение. Вроде как - перебрали какие процентные коды вы применяете и вот остается у вас сумма X. Вам надо абсолютными кодами набрать максимальное число не больше X.

    А так полный перебор придется хотябы частично делать. Это рекурсивной функцией придется реализовать - гуглите "полный перебор" хоть даже тут.
    Ответ написан
    Комментировать