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

Автор riadwaw, 14 лет назад, По-английски

Today, 20:10 MSK

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

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

How to solve 500?

  • »
    »
    14 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +12 Проголосовать: не нравится

    Динамика. Прошли i рек, оказались на такой высоте. Переходы либо на 1 вверх по суше, либо по морю. Это какой-то len^2*m. Осталось заметить, что работают два указателя, потому-что что-то выпукло куда-то.

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

      Вечный вопрос: а как заметить что "что-то выпукло куда-то"?

      • »
        »
        »
        »
        14 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +4 Проголосовать: не нравится

        Ну это же корень. Он всегда выпуклый. Дальше надо пописать какие-то оценки и увидеть, что если нам сейчас выгодно опуститься на 1, то в прошлый раз это было еще выгоднее. А еще почему эти коментарии на английском? Пошли в другую ветку.

      • »
        »
        »
        »
        14 лет назад, скрыть # ^ |
         
        Проголосовать: нравится -23 Проголосовать: не нравится

        // эта ветка — английская.

        Сразу скажу, что сам не успел дописать задачу.

        Я заметил это так: нарисовал карту, хочу пройти в точку (x, y) из (x - 1, 0). Тогда я могу в неё попасть тремя способами: пройти по острову x - 1 расстояние y, затем по воде (получается перпендикулярно) расстояние width[x - 1], пройти по воде перпендикулярно расстояние width[x - 1], потом по острову x расстояние y, причём эти два значения будут равны (думаю, что это очевидно), либо пройти по "гипотенузе" расстояние . А потом вспоминаем, что в прямоугольном треугольнике длина гипотенузы всегда меньше суммы длин катетов, ну и интуитивно понимаем аналогию.

        P.S. Понимаю, что сказал полный бред, но это были всего лишь мои мысли :)

  • »
    »
    14 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +27 Проголосовать: не нравится

    Alternative solution. At first assume we got from 0, 0 to sumWidths, 0. Take this time as an answer. Then length times do following — increase difference between indices of source and destiantion ports on some river (or walk 1 segment anywhere). Choose river where such operation would lead to smallest increase of answer. Notice that for this river next increase would be bigger, so our algorithm is correct

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

    А еще оказывается работает решение добавить подъем на 1 там где он меньше всего нагадит length раз. Видимо опять таки из за того что корень — очень хорошая функция.

  • »
    »
    14 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +11 Проголосовать: не нравится

    Another alternate solution. This problem is equivalent to knapsack problem (we want to take L meters up). So we have width.size() + 1 of objects, width.size() of there is rivers and one is the object that correspond to moving up (his width is 0, and his speed is walk). So we can proof that it's possible to solve this problem in such way: For all objects put into array L values timeToGo(width, Y+1, speed) — timeToGo(width, Y, speed) (1 <= Y < L), than sort this values, and sum first L values from array.

    So this sum is the answer to the problem without sum for all rivers timeToGo(width, 0, speed).

    timeToGo(w, y, s) = sqrt(w*w + y*y) / s.

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

ну я и весельчак, написал решение 500 для непрерывного случая и вспомнил условие за 5 минут до конца.
как решать?)
UPD непрерывный = лодку можно брать в любой точке острова
UPD2 вопрос уже неактуален

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

А как именно надо писать 2 указателя в 500-ке? Я весь контест провозился, так и не заработало.

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +77 Проголосовать: не нравится

посмотрите решение 250-ки пользователя xOberon и результаты челенжей

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

My solution (Java) with 1 * n * length sqrt calculations works appr. 2 seconds and was challenged (got TL). I suppose it would get AC written in c++. The question is, how to avoid such number of sqrt's? Am i missing something?

UPD. It got TL as I forgot to cast width[i] * width[i] so there was an overflow, and NaN values produced time limit on max test. With cast it works about 300ms, which is totally comrehensible.

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

Что теперь можно не боятся что 10^9 не уложится в 1 сек?

»
14 лет назад, скрыть # |
 
Проголосовать: нравится -12 Проголосовать: не нравится

Напишите как решать 250