Editorial for WC '18 Contest 1 S3 - Reach for the Top
Submitting an official solution before solving the problem yourself is a bannable offence.
This problem may be solved with two distinct approaches.
Graph Theory Approach
Let's represent the rope as a directed graph with nodes (numbered from
to
), with each node
representing Bob holding onto the rope at a height of
. Each action which would take Bob from a height
to another height
then corresponds to an edge from node
to node
. We're then looking for the shortest distance (minimum sum of edge weights) from node
to any node from
upwards.
BFS (Breadth First Search) is a well-known algorithm which can be used to compute shortest distances on unweighted graphs such as this one. The time complexity of BFS is , where
is the number of nodes in the graph, and
is the number of edges. In this case
is in
, but
is in
, as each node has
outgoing edges corresponding to possible drop actions from it. This gives us an overall time complexity of
, which is too slow to earn full marks.
It's possible to optimize this approach by making the graph weighted, and adding an extra set of nodes to it. Let's refer to the original nodes as
, and the new nodes as
, with each new node
representing Bob being mid-drop at a height of
. We'll want to have a weight-
edge from each node
to
, representing the continuation of a drop. The start of a drop can then be represented by a weight-
edge from each node
to
, while the end of a drop can be represented by a weight-
edge from each node
back to
. This removes the need for
outgoing drop-related edges from each node!
We can no longer use BFS due to the graph being weighted, but in this case, we can use a variant of it which works when all edge weights are equal to either or
. This variant uses a deque rather than a queue, and pushes nodes coming from weight-
edges onto the front rather than the back of the deque. It similarly runs in
. Since
and
are now in
, this gives us an overall time complexity of
, which is fast enough. Note that Dijkstra's algorithm could be used instead, though it's slower and slightly more complex.
Dynamic Programming Approach
Let be the minimum number of jumps required for Bob to hold onto the rope at a height of
, and let
be the maximum height
such that
. Initially, we have
and
, and we'll let
for convenience. We'll proceed to fill in the DP values in a series of phases corresponding to increasing
values, starting with
. For each
, we'll iterate over heights
from
up to
. For each such
, either
, or
has yet to be filled in and we can set it to
(due to dropping down from a height of
). Either way, we'll end up with this phase of DP values all filled in, and from each
we can fill in
as well, while updating
as appropriate. As soon as we arrive at
,
must be the answer, and if we instead run out of new phases to explore, then the answer must be
-1
.
Comments