Задать вопрос
Ответы пользователя по тегу C++
  • Что не так с алгоритмом создания максимального числа из исходного, используя двоичную СС?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что нельзя просто искать максимальное скопление единиц. Их может быть несколько - какое из них выбирать зависит от того, что идет после них. Например вот такое число в двоичной системе: 1001110100101110110.

    Тут есть 2 куска 1110. Но за первым идет "010", а за вторым "011". Начинать со второго - выгоднее.

    В этой задаче очень маленькие ограничения - можно полностью перебирать все возможные числа и брать максимальное. Можно даже не переводить в двоичную систему, а воспользоваться битовыми операциями.
    Когда вы узнали, сколько битов в числе, то самый младший бит x можно получить как x&1. Сдвинуть все биты числа на одну позицию вправо - это x >> 1. При этом младший бит пропадает. Чтобы вставить новый бит b слева нужно сделать x | (b << k) - тут k - номер позиции этого бита, считая с 0.

    Используя эти операции вы можете просто в цикле получать следующее число после циклического сдвига и из них искать максимум. Только сначала узнайте, сколько всего бит в числе.

    И так, для развития: Если бы ограничения были слишком большие (число в десятки тысяч бит), то тут пришлось бы применять умные строковые алгоритмы. Это была бы задача на поиск лексикографически максимального циклического сдвига. Решается с помощью суффиксного дерева, суффиксного массива или суффиксного автомата.
    Ответ написан
    2 комментария
  • Что делает в данной ситуации yield()?

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

    Yield говорит планировщику, что сейчас хорошо бы текущий поток вытеснить.

    Зачем он тут нужен? В сильно конкурентной среде это позволит другим потокам что-то доделать и сократить накладные расходы на попытки захватить мьютекс. Но вообще говоря тут он не нужен. И вообще надеяться на yield - плохая идея. Планировщик может его и вообще проигнорировать.
    Ответ написан
    Комментировать
  • Почему не работает перегрузка класса?

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

    Если же у вас указатель, к которому вы применяете операцию ++, то вызывается не перегруженный оператор, а используется арифметика указателей - просто сдвигается адрес в памяти на следующий.

    Попробуйте (*p)++.
    Ответ написан
    2 комментария
  • Как убрать нілики из ответа даного кода, ответ правильний только нулі виводить перед ответом?

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы выводите всегда 2N цифр. Даже если в ответе их меньше.

    Надо циклом найти в массиве самую последнюю не нулевую цифру и выводить с нее.

    Еще, похоже, ваша реализация картсубы работает только если длина чисел - степень двойки. Надо N делать не 20, а, допустим, 32 (на самом деле надо смотреть на длины входных чисел и брать минимальную степень двойки покрывающую их).
    Ответ написан
  • Где ошибка в алгоритме создания плоской выпуклой фигуры?

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

    Уберите ненужные переменные. Еще, зачем у вас там i % columns?

    Похоже, надо в output.txt выводить, а не в stdout.

    Еще, советую выводить перевод строки всегда, и не пропускать его на последней строке вывода.

    Чтобы не было проблем с пробельными символами - читайте в двух вложенных циклах до rows и columns по одному char (а не string до eof). Это и ввод упростит и сделает его более безопасным ко всяким артефактам в тестах.
    Ответ написан
  • Почему функция не возвращает указатель на объект класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (!a)	{
        a->s = s;
        cout << 5;
        return a; //ошибка, не возвращает указатель на обьект класса
    }


    У вас тут a==NULL - пустой указатель. Вы пытаетесь его члену что-то присвоить (то. что программа не упала - вам дико повезло). потом вы возвращаете этот же пустой указатель.

    Вам надо создавать новый объект через new в этом случае.
    Ответ написан
    3 комментария
  • Как решить данную задачку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если он указывает на "E" и встретил 0, куда он будет указывать после поворота? На "N".
    Аналогично, в обратную сторону, при указывании на " N" после 1, он будет указывать на "E".

    Чему это соответствует в вашем массиве a? Что происходит с индексом?
    Ответ написан
    Комментировать
  • Как найти внутри текстового файла слово?

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

    Быстрые алгоритмы есть: Кнута-Морриса-Пратта, Бойера-Мура. Там есть примеры реализации алгоритма в википедии прямо кодом на Си. Эти алгоритмы сканируют строку текст посимвольно. Эту часть нужно тупо заменить вводом очередного символа из файла (не забудьте сделать буферизацию, если ваш ЯП этого не делает сам).

    Ну, или, если файл не большой, то можно тупо прочитать весь файл в строку и запустить какой-нибудь встроенный метод поиска подстроки в строке. Большинство ЯП уже реализуют какой-либо быстрый метод поиска.
    Ответ написан
    Комментировать
  • Где в решении задачи ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Инициализируйте не нулями, а двумя первыми числами и min1|2 и max1|2. Не забудьте их в нужном порядке сделать (num1max>=num2max). И цикл с 2 гоните, а не от нуля при этом.

    Например на тесте {1, 0} у вас программа может вывести 2 нуля.

    Потому что num1min и num2min останутся нулями а оба произведения по нулям.
    Ответ написан
  • Как вращать кривую Безье в функций на WinAPI?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Для поворота достаточно перед SetPixel повернуть xu и yu на угол, пропорциональный прошедшему времени. Ну или количеству тиков, но лучше по таймеру ориентироваться.

    Чтобы окно перерисовывалось периодически само надо делать как тут: запустить таймер на несколько миллисекунд и по его срабатыванию перерисовывать окно. Можно или как в этом примере стирать и рисовать заново, а можно вызывать WM_PAINT через какой-нибудь RedrawWindow:
    RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
    Ответ написан
  • Как Исправить код?

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

    Можно делать так вместо ZeroMemory:
    STARTUPINFO info={sizeof(info)};
    Ответ написан
  • Как удалить запись из структуры?

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

    Для удаления надо пройтись по всему списку - это уже делается в функции main при выводе библиотеки (кстати, там не нужен pLibrary. Можно совместить цикл while и цикл for после него. Вы проходитесь циклом по элементам списка, кладете их в массив и потом проходитесь по массиву. Достаточно просто делать с ними, что вам надо прямо в первом цикле).

    Потом, вместо вывода сравнивайте название текущей книги с введенным с клавиатуры (функция strcmp). Если совпало, то надо предыдущему элементу в next присвоить next текущей записи и потом вызвать free() от текущей записи и вывалиться из цикла через break.

    Да, единственная сложность - надо поддерживать указатель на предыдущую запись, а лучше даже на next у предыдущей записи (это будет LIBRARY**). Тогда для удаления надо просто head->next записать туда и текущий элемент выпадет из списка. Перед переходом к следующему элементу в цикле while просто перезапишите этот указатель на &head->next. Изначально он должен быть &head. Таким образом можно удалить даже первый элемент списка без разбора случаев.
    Ответ написан
  • Как вычислить количество слов, которые начинаются с большой буквы, подобное этому коду?

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

    Вам могут понадобится функции isalpha() isspace() isupper() из файла ctype.h
    Ответ написан
    Комментировать
  • Как изменить код, чтобы заполнялась нижняя заштрихованная треугольная часть квадратной матрицы вместо верхней на С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Диагональ, которая идет слева сверзу вниз вправо - это j == i. Вторая диагональ - это j == n-1-i.

    Соответственно, штриховка это когда j лежит между n-1-i и i включительно. Надо оба знака развернуть. Только сначала замените < N... на <= N-1...
    Ответ написан
    Комментировать
  • Как сделать реверс масива на С++?

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

    void Reverse (int *a, int x, int y) { 
      int i = y+1;
      int j = x-1;
      while (i < j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        i++;
        j--;
      }
    }


    Или, если хочется, можно покороче:
    for (int i=x+1, j = y-1; i < j; i++, j--) {
      std::swap(a[i], a[j]);
    }


    Или совсем просто, если это не задание а для дела нужно:
    std::reverse( &a[x+1], &a[y]);

    Только надо обязательно проверить, что x < y - что есть что разворачивать.
    Ответ написан
    1 комментарий
  • Как из циклического сдвига вправо сделать циклический сдвиг влево?

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

    Вариант чуть получше - вместо разворота, представить, что массив развернут. Тогда при любом обращении к элементу номер x надо обращаться к элементу n-1-x. Т.е. тупо в программе, где сдвиг делается(после ввода), каждый arr[x] заменить на arr[n-1-x] (примеры x у вас там - n-1, i+1, i, 0).

    Вариант еще лучше - включить голову и просто подумать. Сдвиг влево - это в сторону уменьшения индекса. arr[0] становится arr[1], arr[1] - arr[2], и так далее. arr[n-1] становится arr[0]. Т.е. надо в буфер запомнить arr[0], пройтись циклом по возрастанию i и присвоить каждому элементу следующее за ним (+1 к индексу) значение. Потом arr[n-1] заполнить из буфера. На самом деле получится то же, что и в предыдущем варианте, но без лишних вычислений индексов.

    Вариант совсем хороший - не городить shift сдвигов на одну позицию, а сдвигать сразу на shift позиций. Для этого в буфер надо засунуть первые shift элементов, потом пройтись циклом и записывать в i-ый значение из i+shift-ого. Потом последние shift позиций заполнить из буфера.

    Вариант со звездочкой - можно делать без буфера на shift элементов, и сдвигать на shift позиций прямо в массиве, но тут надо знать про перестановки и GCD.
    Ответ написан
    6 комментариев
  • Что не так с кодом для решения по математической игре Баше?

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

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

    Возьмите, например, k=4,5,6 и порисуйте на бумажке, попробуйте подсчитать, какие позиции выигрышные (из них можно сделать ход в проигрышную позицию), а какие - проигрышные (любой ход ведет в выигрышную позицию). Считайте увеличивая количество предметов. Позиция с 0 предментами - проигрышная - предыдущий игрок придя в нее выиграл. Позиция 1 - выигрышная, потому что можно пойти в проигрышную 0. Найдите закономерность, попытайтесь ее логически обосновать.

    Пример для k=3:

    0 - проигрышная

    1 - выигрышная ( можно взять 1)

    2 - выигрышная (можно взять 2)

    3 - выигрышная (можно взять 3)

    4 - проигрышная

    5 - выигрышная (можно попасть в 4, взяв 1)

    6 - выигрышная (можно попасть в 4, взяв 2)

    7 - выигрышная (можно взять 3 и попасть в проигрышную 4)

    8 - проигрышная (любой ход ведеть в выигрышные 5-7)

    ...
    Ответ написан
    3 комментария
  • Где собрать решение?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Есть такая штука: https://chromium.googlesource.com/infra/goma/server/

    Позволяет собирать большие проекты параллельно на куче машин. Да, эти 30 минут сборки все равно придется потратить. И никто вам бесплатно вычислительные мощности под это не даст. Придется свои сервера настраивать.

    Еще есть вариант переструктурировать ваш проект, что бы при небольших изменениях понадобилось бы собирать лишь малую часть объектников. И 2 гигабайта в одном файле - это какой-то перебор. Если вы тесты разобъете на много логически обособленных частей, то есть шанс, что сборка сильно ускорится. Да, придется запускать больше файлов, но это сделать просто.
    Ответ написан
    Комментировать
  • Как я могу использовать объект JavaScript в c++?

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

    Если же вы хотите эту конкретную (msg) структуру парсить, то возможно вам удасться превратить json в class в двумя string и одним int.
    Ответ написан
    Комментировать