1. C++ / Говнокод #27401

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    vector<int> res;
    ...
    for (int i = 0; i < res.size(); i++) {
        printf("%d%c", res[i], " \n"[i + 1 == res.size()]);
    }

    Решил вспомнить как олимпиадные задачки решать.

    Запостил: 3_dar, 07 Мая 2021

    Комментарии (30) RSS

    • Олимпиадные задачи принято решать как в 1999-м году?
      " \n"[i + 1 == res.size()]
      Ответить
      • > Олимпиадные задачи принято решать как в 1999-м году?

        А что не так? Напиши лучше.
        Ответить
        • я еблан, и не сразу понял в чем фишка
          >" \n"[i + 1 == res.size()]
          для последнего там будет \n, для остальных пробел

          тогда беру свой высер обратно


          я бы написал
          //
          	for(auto i: res)
          	{
          		std::cout << i << ' ';
          	}
          	std::cout << '\n';

          но это не спортивно, и я для пустого обосрется
          Ответить
          • Недостаточно модерново.
            std::copy(res.cbegin(), res.cend(),  std::experimental::make_ostream_joiner(std::cout, " "));
            std::cout << '\n';
            Ответить
            • >res.cbegin(), res.cend()
              а можно еще std::for_each и лямбду:)
              Ответить
            • Это с какой версии работает?
              Ответить
              • library fundamentals TS v2 вроде для С++17. Ничего требующего более позднюю без натягивания совы на глобус не нашёл.
                Ответить
                • Хотя погоди! Есть же ranges! Они с С++20!
                  std::ranges::copy(res,  std::experimental::make_ostream_joiner(std::cout, " "));
                  std::cout << '\n';
                  Ответить
          • Твой вореант лишний пробел выведет.
            Ответить
            • угу:/

              не, твой вариант классный, мне следовало подумать более семи секунд, прежде чем его комментировать)
              Ответить
            • лол, я нашел
              boost::algorithm::join(..
              Ответить
              • > олимпиадные задачки
                > boost
                Ответить
                • 7/8 олимпиады собираешь буст из исходников, затем вызываешь boost::solve_all_problems() и течёшь.
                  Ответить
                • ну ладно, хотя бы итераторы тогда
                  for (auto i = res.cbegin(); i != res.end(); ++i)
                  	{
                  		std::cout << *i << " \n"[(i + 1 == res.end())];
                  	}
                  Ответить
        • А как же modern C++, стримы, experimental::ostream_joiner?
          Ответить
      • А почему бы и нет? Сначала сложение, потом сравнение, потом bool приводится к 0 или 1, что является валидным индексом. Строковый литерал, это char[x], так что всё нормально.
        Ответить
    • Кстати, этот способ не работает для пустых массивов.
      Ответить
    • Помню задачи были.
      1) написать быстрый аглоритм возведения в степень
      2) написать алгоритм подсчета кол-ва островов на карте
      3) найти кратчайший путь (что бы не было n*n перебора)
      4) в ряде чисел найти отрезок чисел с наибольшей суммой
      Ответить
      • > написать быстрый аглоритм возведения в степень
        но зачем? возвездение же сводится к двум трансцендентным и умножению и всё
        выиграть пару тиков можно только если сильно ужать условия
        Ответить
        • Имеется в виду уменьшить количество умножений до логарифма степени
          Ответить
          • но ведь буртить степень умножениями можно только для целых неотрицательных покпоказателей, а нативные питухи всегда О(1)
            Ответить
      • > написать быстрый аглоритм возведения в степень

        Какая-то ма-те-ма-ти-ка.

        > написать алгоритм подсчета кол-ва островов на карте

        Хочу точный размер в квадратных километрах, до которого камень в море будет «островом», а после – «материком».

        > найти кратчайший путь (что бы не было n*n перебора)

        Хорошая задачка на алгоритм Дейкстры, либо на поиск в ширину.

        > в ряде чисел найти отрезок чисел с наибольшей суммой

        Там бывают отрицательные числа? Если нет, то ответ – сам этот ряд. Если бывают, то пиздец!

        Мой вывод: олимпиада на 5 или 6 /10.
        Ответить
        • > Хочу точный размер в квадратных километрах, до которого камень в море будет «островом», а после – «материком».
          Там, небось, либо на карте ничего кроме островов нет, либо материки касаются границы карты.

          > Там бывают отрицательные числа? Если нет, то ответ – сам этот ряд. Если бывают, то пиздец!
          Да, в принципе, ничего сложного. Насколько я понимаю, главная проблема — заставить это работать не за N².
          Ответить

    Добавить комментарий