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

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


Предлагаю здесь обсудить сие мероприятие и задачи.

Сслыка на задачи/результаты: http://acm.timus.ru/monitor.aspx?id=100

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
У кого-нибудь были проблемы с тестом #57 в задаче C? Надо полагать, он на точность. Но никакие шаманства не помогли сдать задачу...
15 лет назад, скрыть # |
 
Проголосовать: нравится -7 Проголосовать: не нравится
Меня больше удивляет задача J. Я написал решение, в котором не мог найти ошибку всю заморозку, но так и не прошел дальше второго теста. Условие было написано отвратительно, но для тимуса это привычно. Вообще, я до сих пор не уверен, что удаление одного символа занимает одну секунду. Надеюсь, что это так. Поправьте меня, если я ошибаюсь. Те, кто решил эту задачу, пожалуйста, поделитесь тем, как решали ее, может быть это подскажет мне где же я ошибся. 
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Не туда

15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Как решать задачу G, ставил вместо вопросов одинаковые символы и релаксировал ответ ВА 30?
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Нужно было рассмотреть 2 случая: когда в обоих строках вместо вопросов один и тот же иероглиф, и когда в каждой строке - какой-то свой иероглиф (но один и тот же для каждой строки). Такое решение зашло.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +5 Проголосовать: не нравится
    У нас прошло следующее решение:
    Найдем самый популярный символ C1 в первой последовательности. Найдем самый популярный символ во второй последовательности C2.
    Теперь выберем лучшее из следующих решений:
    1) Заменить все нули в первой последовательности на C2, а во второй - на C1.
    2) Заменить все нули в первой и второй последовательности на C (где C принимает все возможные значения от 1 до 100000).
    Проверку несложно осуществлять за O(1).
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Какая самая распространенная ошибка в L?
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Кто как решал задачу С (Angry birds)?


Я для каждой пары обезьян находил множество обезьян, убиваемое выстрелом, проходящим через этих двух обезьян, и потом перебором находил минимальное множество выстрелов.
Для двух данных обезьян угол и скорость, под которыми нужно стрелять, я находил так: угол ищем бинарным поиском. При данном угле из несложного уравнения получаем (точно) скорость, которую нужно развить, чтобы "убить" первую (левую из двух) обезьяну. После этого смотрим: если выстрел прошел под второй (правой) обезьяной, угол выстрела нужно уменьшать, а если над - то увеличивать.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    два бинпоиска вложенных, один по составляющей vx, другой - по vy

    еле затолкал из-за точности =)
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      По сути, подход тот же. Может, они не любят тригонометрию в решениях...
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        у меня нет никакой тригонометрии

        я даже корни нигде не извлекаю :)
        • 15 лет назад, скрыть # ^ |
           
          Проголосовать: нравится 0 Проголосовать: не нравится
          Ну да, твой способ понятен, там действительно не надо даже корней. Мне просто интересно - на чем там можно так жестко чикать решения по точности
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Все авторские решения, что у нас были, просто строили уравнение параболы в явном виде и работали уже с ним. Бинпоиски и тригонометрию действительно было упихать сложно. Тесты 57-62 - на проверку точности и некоторых граничных случаев.
  • 15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    У меня отличие в том, что когда зафиксировали 2ух обезьян, получаем систему линейных уравнений относительно {p, q2}:

    p · xi - q2· xi2 = yi

    p · xj - q2· xj2 = yj

    Проверяем q2  >  = 0, после чего подставляем остальных обезьян в уравнение. Это всё делается в целых числах, чтоб не было проблем с переполнением брал по разным простым модулям. 

15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Почему в G не проходит такое решение?

Нам нужно максимизировать сумму cnt1[i]*cnt2[i], где i=1...100000.

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

В итоге ВА13.

  • 15 лет назад, скрыть # ^ |
    ← Rev. 5  
    Проголосовать: нравится +5 Проголосовать: не нравится

    Рассмотрим тест:
    7
    0 0 1 1 2 2 2
    9
    0 0 1 1 1 1 2 2 2

    30

    11
    0 0 0 1 2 2 2 3 3 3 3
    11
    0 0 0 1 1 1 1 2 2 2 3

    77


    10
    0 0 1 2 2 2 3 3 3 3
    11
    0 0 0 1 1 1 1 2 2 2 3

    72


    Нули из первой строки ты будет превращать в 1, т.к. это будет максимизировать твою сумму, а нули из второй строки в 3... Но лучше будет все нули превратить в 2.

    UPD. Шутканул, после того как ты поставишь 1 в первой строке, во второй ты тоже выберишь 1, сейчас додумаю...

15 лет назад, скрыть # |
 
Проголосовать: нравится +56 Проголосовать: не нравится
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Как решать задачу K. На контесте были идеи, но писать не осмелились
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
В задаче B я пользовался предположением, что в оптимальном решении наши палки - это хорды окружности с центром в основании березы. Предположение оказалось верным. Кто нибудь может доказать это предположение?
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Я написал через другое предположение: палки образуют тупоугольный треугольник с углом 135 градусов, третья сторона которого - гипотенуза равнобедренного прямоугольного треугольника (катеты - береза и земля). То, что прямоугольный треугольник должен быть равнобедренным, доказывается элементарно, угол 135 градусов - через дифференцирование. Угол 135 градусов опирается на дугу в 270 градусов, а это оставшаяся часть окружности.
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      А, ну да, дифференцированием можно

      А как нибудь красиво это доказывается?:)
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Я глубоко подумал: по-моему, красивее дифференцирования ничего найти не получится (т.к. хотя бы то, что из всех прямоугольников наибольшая площадь у квадрата, доказывается как раз через дифференцирование).
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        Это же школьный контест. Конечно, доказывается.

        Разобьём наш 4-угольник на 2 треугольника диагональю, соединяющей точки примыкания палок к берёзе и к земле. Пусть длины палок - a и b. Зафиксируем какую-то длину этой диагонали L. Тогда максимум площади нижнего треугольника очевидно достигается, когда эта диагональ идёт под углом 45. Тогда эта площадь равна 1/4*L^2.

        Пусть теперь угол между палками равен p. Тогда площадь верхнего треугольника равна 1/2*a*b*sin(p). L^2 = a^2+b^2-2*a*b*cos(p). Итого суммарная площадь 1/2*a*b*sin(p) + 1/4*(a^2+b^2-2*a*b*cos(p)) = 1/4*(a^2+b^2) + 1/2*a*b*(sin(p)-cos(p)) = 1/4*(a^2+b^2)+1/sqrt(2)*a*b*sin(p-45). Максимум синуса достигается в 90, т.е. при p=135. Итого ответ 1/4*(a^2+b^2)+1/sqrt(2)*a*b

  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится
    мда, тупо 2 вложенных тернарника по проекциям на оси заходят...
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Хотелось бы узнать, как по-человечеки Кубик-Рубика решать?? (решал bfs)
  • 15 лет назад, скрыть # ^ |
    ← Rev. 3  
    Проголосовать: нравится 0 Проголосовать: не нравится

    ну это почти по-человечески

    мы просто для каждого слоя искали его нужный сдвиг (перебрав сначала общую картинку)

    скидываем цвета, проходясь по кругу, в вектор, и с такими векторами уже все просто

  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +13 Проголосовать: не нравится
        for(int i=0;i<6;i++)
        {
            cin>>x;
            if (i!=2 && i!=3) v.pb(x);
        }
        
        int ans=100;
        for(int i=1;i<=4;i++)
        {
            int now=0;
            for(int j=0;j<v.sz;j++)
            {
                int m=min((i-v[j]+16)%4,(v[j]-i+16)%4);
                now+=m;
            }
            ans=min(ans,now);
        }
        cout<<ans;
  • 15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится +1 Проголосовать: не нравится

    Рассмотрим левый верхний квадрат 2*2. Заметим, что если в нем все цвета одинаковые, то картинка такая, какая нужна. Тогда переберем цвет, который в нем будет. Каждая из четырех клеток квадрата лежит на отдельном слое, а каждый слой представляет из себя зацикленную посл-ть 1, 2, 3, 4. Пусть у нас в некоторой клетке верхнего квадрата стоит число i, а мы хотим получить j. Понятно, что мы можем циклически сдвинуть последовательность 1-2-3-4 вправо или влево. Собственно, перебираем цвет левого верхнего квадрата и банально считаем стоимость сдвига его элементов в нужный цвет.

15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
А что за 14-ый тест в задаче К?