Задача №894. Черепаха
Автор разбора: Михаил Густокашин
Во-первых необходимо считать входные данные. Время прорастания я преобразовывал в минуты, а расстояние от начала грядки - как расстояние от предыдущего одуванчика до этого. Т.е. от расстояния от начала до данного одуванчика следует отнимать расстояние от предыдущего одуванчика до начала грядки. Ввод данных в этой задаче достаточно муторное дело (для пишущих на паскале, для тех кто пишет на Си достаточно в качестве форматной строке scanf указать "%d:%d"). Теперь подумаем над алгоритмом, по которому черепаха должна есть одуванчики. Естественно, что по пути к последнему одуванчику она должна есть все, что уже проросли, потом съесть последний одуванчик, а затем возвращаться и есть все (они уже проросли раньше последнего). Но возникает одна проблема: а что если мы придем, а последний одуванчик еще не вырос? Надо ждать, причем ждать не у последнего одуванчика, а в самом начале грядки. Это объясняется тем, что, задержавшись в начале грядки, мы сможем съесть больше одуванчиков по пути туда и меньше оставить на обратный путь. Задача решается дихотомией. Минимум - нулевая задержка, максимум - время прорастания последнего одуванчика - условие выхода - если пришли ровно к всходу последнего одуванчика или максимум минус минимум меньше 0.1 минуты (для верности). У нас будет переменная, отвечающая за задержку, значение которой будет равно (max + min) / 2 (обозначим эту переменную wait). Также у нас будет переменная, в которой храниться значение времени в данный момент (time). При входе в цикл считаем wait, а затем time := wait. Теперь идем по всем одуванчикам от первого до предпоследнего. К времени прибавляем время проползания от предыдущего одуванчика к следующему (time := time + x[i] / vmax). Если получилось, что время, в которое мы подползли к одуванчику больше либо равно времени прорастания этого одуванчика, то увеличиваем счетчик количества съеденных одуванчиков и к времени прибавляем d. После того, как прошлись по всем одуванчикам, кроме последнего, прибавляем к общему времени, время, за которое черепаха проползет расстояние от предпоследнего до последнего одуванчика. Теперь, если время равно времени прорастания одуванчика - то на выход, если больше - то max := wait, если меньше - min := wait. Теперь мы определили нужную задержку и нам известно время, затраченное на путь до последнего одуванчика. Также известно, что к этому времени он уже пророс. Чтобы получить итоговое время, надо к этому времени прибавить время на съедение оставшихся одуванчиков (мы знаем, сколько мы съели на пути туда) и время на обратную дорогу (просто разделить расстояние от начала до последнего одуванчика на скорость). Ответ готов. Осталось только преобразовать его к нужному формату