Блог пользователя JKeeJ1e30

Автор JKeeJ1e30, 13 лет назад, По-русски

Вот у меня уже достаточно давно родился такой вопрос: что в программировании важнее-нестандартный или стандартизированный подход к задаче?


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

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

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

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

13 лет назад, # |
  Проголосовать: нравится -22 Проголосовать: не нравится

Многие реализационные, если их написал раз 20-30, начинают казаться простыми и удобными в кодинге:)

"Творческие" задачи - очень условное понятие. Обычно речь идет или о "общем подходе", который просто знают меньше людей, или о какой-то вещи, которую, по своей глупости, просто половина участников не знают, и поэтому пишут какую-то ерунду. Не знают они, допустим, Гауссовского обобщения теоремы Вильсона, да и слабо знакомы с теорией чисел - и тут начинаются проблемы, если задача требует именно этого (может, пример не очень, но просто вспомнил задачу, с которой недавно столкнулся на контесте - большая половина участников зависла из-за весьма поверхностных знаний теории чисел).


  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    А что это такое ? (я про обобщение)
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится -11 Проголосовать: не нравится

      http://en.wikipedia.org/wiki/Wilson's_theorem - второе обобщение (о произведении всех   меньшых за N,   взаимно простых с N, взятом по модулю N). Мало кто помнит, как оно называется - ведь в этом необходимости особой нету.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        На это как-то кстати была задача на opencup, в которой прямо и просили найти произведение всех взаимно простых.

        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Вот за это я и не люблю OpenCup. Там время от времени требуются спецзнания, которых у меня нет. А нет, кстати, потому, что собственно на ACM такие задачи не дают.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

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

            • 13 лет назад, # ^ |
              Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

              Вот это интересно - про "за время контеста". Сам бы я навряд ли вывел, я бы просто занялся другой задачей - меньше бы времени потратил. Или написал бы брутфорс-решение и попытался бы угадать утверждение теоремы. Но я вполне допускаю (хоть и в упор не понимаю почему), что некоторым теория чисел кажется простой и очевидной. А вопрос такой: действительно ли известны случаи выведения этой теоремы или какой-нибудь другой известной, но не всем, и сравнимой по сложности за время контеста?
              P.S. Да, а основная проблема тут в том, что использование Google может дать большие преимущества. А в идеале не должно бы.
              • 13 лет назад, # ^ |
                Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

                У нас несколько команд решили задачу, не зная данного факта


                UPD. 2 Ferlon. Решившие у нас команды принципиально не пользуются на контестах гуглом.

              • 13 лет назад, # ^ |
                  Проголосовать: нравится +1 Проголосовать: не нравится

                Мне рассказывали полулегендарные истории о том, как Дуров и Лопатин на финале на ходу придумали Форда-Фалкерстона, так как они не знали даже такого термина, как задача на максимальный поток.

                Правда, я не знаю, сколько в этом правды)

          • 13 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится +7 Проголосовать: не нравится

            По поводу ненужных знаний. Это тоже полезно. Для развития мозгов, что называется. Например на сборах (школьных) к нас приехал Максим Бабенко и рассказал про матроиды.(Года два назад он же там же рассказывал про дерево Гомори-Ху). Оба раза потом дали задачку. Пересечение матроидов, в отличии от второго, даже кто-то написал. Я очень удивлюсь, если это когда-то пригодится, но вряд ли это было вредно послушать и понять. Знания вообще лишними не бывают. Да и там есть очень общие идеи, которые в частных случаях вполне могут встречаться. Так что на АСМ этого нет - какая-то дурацкая отговорка (кроме случая когда готовишься в упор к [четверть|полу]финалу, который очень скоро).
          • 13 лет назад, # ^ |
              Проголосовать: нравится +2 Проголосовать: не нравится
            Нормальные там задачи. Не одним АСМ мир живет.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        спасибо
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится -18 Проголосовать: не нравится

      Двойной пост.

      Кстати, по поводу "проходят" (ответ на пост чуть ниже) - а вам не кажется, что "проходят" - и пусть себе проходят, но учиться надо самому?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это вообще к чему? Понятно, что нужно учится самому, но я рассказал в комментарии ниже о другом. О том, что нужно договариваться о принципах что считать творческой задачей. А Вы, по-моему, к словам придираетесь. И вообще, почему вы уходите от вопроса?:) Вопрос был задан: что для Вас проще-написать программу на реализацию строк на 500(какой-нибудь sql-сервер, допустим) или же какую-нибудь программу строк на 100, которую надо придумать(Допустим,решается факторизацией, но еще нужно объяснить, почему факторизация работает) 
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Зависит от конкретного случая. Очень сильно зависит от конкретного случая.

          Весной на одном контесте мне было лень думать над задачей - и я писал в ней 4 вложенных тернарника. Естественно, копипастом; так как я мало что вынес в дополнительные функи, а писал почти все в main, то этот быдлокод занимал где-то 400 строк.

          Бывают ведь и такие случаи, когда видно, что факторизация работает, и объяснять просто нету времени (можно это после контеста сделать:))

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Не всегда так. Например, есть задачи которые могут сводится к системе линейных уравнений, где Гаусс теряет точность, и нужно или показать, почему(то есть в какой мере) работают методы Зейделя и простой итерации, или же придумать какое-то другое решение, без системы уравнений. Конечно, что считать творческим решением, а что-стандартным-тут надо договариваться. Например, в одном ЦОППе города 1 задачу о назначениях проходят как стандартную, а в городе 2 проходят задачи, похожие на задачу о назначениях. Тогда задача о назначениях будет для студентов первого ЦОППа стандартной, для студентов второго-творческой. Конечно. Но, как Вам кажется, что проще-придумать и реализовать программу на 100 строк или же сразу написать программу, где ничего не надо придумывать, строк на 500?  
13 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится
Самое забавное, это когда придумываешь какое-нибудь замечательное решение, жутко гордишься :) А потом друзья-программисты (олимпиадники, в отличие от меня) объясняют, что эта штука - просто динамика, или, скажем, дерево отрезков. Поэтому незнание стандартных методов делает процесс более интересным, но, как видите, менее результативным. И на таких ресурсах, как codeforces, конкурировать с олимпиадниками невозможно. Зато, к примеру, на topcoder больше необычных задач, и можно даже попытаться побороться :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится -46 Проголосовать: не нравится

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

    Ну и третья - уже серьезней, но это третья, ее никто и не решает:) :)

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

    • 13 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Ну так в контестах учавствовать всяко интереснее чем алгоритмы учить =)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Ну и это тоже) Правда также довольно интересно разбирать задачи после контеста, благо на CF есть разборы.
    • 13 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      Так кто говорит, что я это специально? Кормена мне подарили, сессия закрыта, лето впереди :) Просто большинство олимпиадников этим занимались в школе, а я занимался почти только математикой. Поэтому и решения задач зачастую более математические)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится
    Конкурировать с олимпиадниками вполне реально, хотя смотря что считать за конкурирование конечно =) Первые места конечно не занять, но вот оранжевый рейтинг получить можно ;)

    Правда я сам собираюсь потихоньку перейти в "клан" олимпиадников - буду летом читать книги и смотреть лекции.

    Согласен насчёт интересности и гордости за изобретенные велосипеды - такое очень часто раньше испытывал :)
    • 13 лет назад, # ^ |
        Проголосовать: нравится -9 Проголосовать: не нравится
      Так, я уже нашел двух единомышленников:) И мне кажется, велосипеды еще можно поизобретать. Вон, Geraldкаждый контест-новый велосипед:). При том порой не понятно, как эти велосипеды ездят, но приезжают в ACCEPTED:)
    • 13 лет назад, # ^ |
        Проголосовать: нравится -7 Проголосовать: не нравится
      Хм... а у меня наоборот... Сейчас понимаю, что если бы в школе меня было кому учить - был бы результат. А так... Сам занимался с ноля примерно год - радость, конечно, есть, мол, диплом всеукры, и все такое... Но сейчас понимаю, что это ерунда, так как конкуренции ноль, и если бы я не тратил по несколько дней, допустим, на то, чтоб самостоятельно придумать алго Беллмена-Форда, то и пользы было бы больше.
      • 13 лет назад, # ^ |
          Проголосовать: нравится +22 Проголосовать: не нравится
        Вот она разница в подходах: для вас самостоятельные занятия с ноля - это ерунда.
        А для меня придумывание велосипедов и занятия спортивным программированием - это способ интересно и с азартом поумнеть.
        И вот так получается что для меня это не ерунда - занимаюсь этим по чуть-чуть уже более года и сам ощущаю что серьезно поумнел и продвинулся в областях прямо с олимпиадным программированием никак не связанных.
        • 13 лет назад, # ^ |
            Проголосовать: нравится -7 Проголосовать: не нравится

          Я не совсем правильно выразился... "Учить" - не то слово. Показать дорогу, что ли. Учить как раз не надо - заниматься надо самостоятельно, а не ждать, пока кто-то на блюдечке все принесет.

          Но надо, чтобы кто-то "показал дорогу" - указал на сайты с разборами, с алгоритмами, на соревнования по программированию... Я первые полгода занятий даже не знал о существовании ТопКодера.

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      У каждого свое представление об "олимпиадниках". Все, кто решает что-то на этом сайте, пусть даже второй дивизион - в определенной мере "олимпиадники". Просто одни говорят "он на первенстве факультета был, какие-то там задачи решал - олимпиадник", и при этом понятия не имеют толком, что такое АСМ.

      А я знаю команды, которые несколько месяцев подряд тренировались в графике "6 дней в неделю по 8 часов командно + индивидуальные" (или меньше командных - с большим упором на индивидуальные занятия), и понимаю, что тратить на АСМ 5-6 часов в неделю, особенно, если еще кучу разного надо узнать (т.е. в сумме на ТС и СФ рейтинг не 5 с лишним тысяч, а намного меньше) - просто смешно. Тогда это хобби, или способ отдыха, но о серьезных результатах можно только мечтать.

      • 13 лет назад, # ^ |
          Проголосовать: нравится +6 Проголосовать: не нравится
        5 с лишним тысяч это ты загнул. natalia имеет суммарный рейтинг 4757, намного меньше чем 5 тысяч, ее однокомандники имеют рейтинг еще ниже. Хочешь сказать, что "это несерьезно и не более чем хобби"? Или вообще что ты подразумевал под "намного меньше"? Или ты хочешь сказать, что Горбачев Иван(mastersobg), который вот что называется сделал себя сам, протащил в одиночку команду на NEERC через Саратовский четвертьфинал(далеко не самый слабый), занимается фигней?
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Уж не знаю, что важнее, это JKeeJ1e30 хороший холиварчик поднял. :-)

Но если брать ACM, то на мой взгляд в команде нужны оба таких человека: «нестандартный» увидит как можно решить какую-либо задачу, предложит способы, на что «стандартный» ответит написанием нужного из 100500 алгоритмов.
  • 13 лет назад, # ^ |
      Проголосовать: нравится -7 Проголосовать: не нравится
    Макс, я вопроса "важнее" и не задавал:) И понятно, что в хорошую команду нужен обязательно чел, который увидит нестандартный подход. Между тем, похоже, именно излишняя нестандартность сыграла против команды Орла на финале(ведь Куприн сам сказал, что там было полно задач из разряда "увидел-набил", но не было кому набивать).
    Конечно, было бы интересно послушать мнение наших уважаемых таргетов к этой проблеме. Что их чаще выручает на тех же срмах: умение увидеть легкий путь к решению или знание конкретных алгоритмов
    • 13 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      Но не было бы нестандартно мыслящих людей - они бы и до этого стандартного финала и не доехали бы. ;-)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Тоже верно. Вот, кстати, и родился совет для Орла: ищите человека который мыслит более стандартно чем вы:)

        Да, кстати, можно еще один холивар внутри этого холивара завести: насколько должны отличатся кодеры в одной команде по уровню стандартности/нестандартности мышления? Если они будут слишком отличаться, то не поймут друг друга:) 
  • 13 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится
    Замечу , что такой расклад в команде , как один человек "стандартный" , а другой "нестандартный" является весьма эффективным! Был в такой команде, сидел с человеком который просто не умел программировать, но довольно хорошо искал решения. И в тоже время ему некоторый задачи казались сложными, хотя там было лишь пара алгоритмов! 
13 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится
What is "standart"?
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Мне не очень нравится постановка вопроса: что значит "проще"? Понятно, что "быдлокод", как выше выразились, проще писать, чем ТВОРИТЬ. Правильный вопрос: что интереснее. И вот здесь - точно "творческие" задачи.
И именно для этого, будучи раньше - банкиром, а сейчас - количественным аналитиком, я со школы занимаюсь спорткодингом - творить, придумывать что-то новое, развивать мозги. Поэтому я всегда радуюсь, когда не знаю стандартного алгоритма и удается придумать свое решение к задаче. Конечно, это сказывается на результатах (кстати, наверное, именно поэтому у меня на ТС волатильность рейтинга под 600), зато интересно придумывать что-то свое, и мозги развиваются.
Я, кстати, за свою АСМ-ную жизнь сам "изобрел" несколько численных методов (тернарный поиск, гаусса-зейделя), а также придумал много методов ускорения задач на перебор, которые очень люблю  (быстрый и эффективный перебор - это искусство! =)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Сергей, ваш ответ мне понятен. Я имел в виду именно простоту, не идейную, а суммарную так сказать, то есть идея+код, время на обдумывание задачи и разработки решения для нее+ время на реализацию этого решения, и именно поэтому я взял для сравнения творческую задачу, которая проста в реализации, но ее сначала нужно придумать, и реализационную, которую придумывать не надо, а надо лишь набить. Для меня лично проще первый тип задач. Для вас, как я понял, тоже?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Здесь сложно сказать. Зависит от этапа контеста. Скажем, в начале контеста - конечно, гораздо интереснее посидеть покумекать над "идейными" задачами, может даже написать и попытаться протолкнуть какую-нибудь "ботву", если не придумывается нормальное решение. Но, например, в последний час, если видна какая-нибудь задача с большим быдлокодом, и есть другая, которую нужно придумать, а потом можно быстро написать, но есть риск того, что не придумаешь - наверное, лучше писать "быдлокод" - тупо, зато наверняка.
      • 13 лет назад, # ^ |
          Проголосовать: нравится -12 Проголосовать: не нравится
        А у меня как раз на последнем часу тяжелее всего быдлокоды даются. Потому что все время боишься, что не успеешь написать, что получишь ВА из-за каких нибудь забытых лонгов или какого-нибудь аналогичного бреда.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          По поводу "забытых лонгов или какого-нибудь аналогичного бреда" хочу добавить, что зря Вы так к этому "бреду" относитесь. Правильно оценить граничный диапазон своих переменных, пожалуй, входит в одну из первостепенных задач.
          • 13 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится

            Одно дело-"неправильная оценка", совсем другое-"забытые лонги". Это не одно и то же.
13 лет назад, # |
Rev. 2   Проголосовать: нравится +43 Проголосовать: не нравится

Именно мне проще реализационные: "Дим, смотри, тут для тебя задача есть..."
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

    А когда одна пишешь? Тренировки, межвуз, СРМы, CF?
    • 13 лет назад, # ^ |
        Проголосовать: нравится +15 Проголосовать: не нравится
      Сама я, конечно, больше люблю идейные. На межвузовской в прошлом году они прямо меня выручили :) Реализация дается медленно, поэтому на соревновании скорее выберу идейную задачу.

      Однако реализацию особенно люблю в контестах, которые сама готовлю или прорешиваю. В четвертьфинале 2010 года я с большим удовольствием занималась реализационной задачей A (которая, кстати сказать, принесла победу команде Saratov SU #2). Реализационные задачи - не такие уж безыдейные. В них важно правильно выбрать структуры данных, организовать программу таким образом, чтобы код получился проще, было поменьше частных случаев и те частные случаи, которые неожиданно возникают по ходу кодирования, органично вписывались в общую логику.