Editorial for WC '15 Finals S3 - Driving Range
Submitting an official solution before solving the problem yourself is a bannable offence.
Let's consider a single instance of Tiny completing the course for now. Let's say that there are targets at the ends of rows , and targets at the ends of columns , with both arrays and sorted in increasing order. It's easy to imagine that it's never optimal for Tiny to drive North or West – instead, he should only move South and East, hitting targets as he goes, in some order. This implies that he'll hit the row targets in increasing order and the column targets also in increasing order, with the only question being how they should be interleaved.
This observation suggests a naive recursive solution which tries all possible interleaved orders of targets. We should keep track of how many row and column targets Tiny has hit, and his current row and column. At each step, Tiny can either hit the next row target, if any (by driving South to its row, driving unit East, and firing a missile), or hit the next column target, if any. This recursive process takes time, yielding an solution in total.
The above algorithm can be improved with the use of dynamic programming. The recursion can be directly memoized to improve its running time to , which is the number of possible states (with at most two transitions from each state). This yields an solution in total, where is the largest value of any target.
To achieve a dramatically more efficient solution, a different approach to the problem will be required. Before we proceed any further, we should observe that a target in column is special in that it's the only target that can be hit without needing to rotate to face it first – as such, if there's a target in column , let's simply remove it from the array (also decrementing by ), and add to the answer (as the first move in this case will clearly consist of firing a missile downwards at it).
Now, let's consider counting how many of each type of move Tiny will need to perform. Clearly, he'll fire exactly missiles in total. Additionally, before firing at each target, he'll need to rotate to face it at some point after entering its row/column – this implies needing to drive East a minimum of times, and South a minimum of times. Besides these required moves, it's a fact that Tiny will need to drive South at least times in total to reach the last row target's row (or times if ), and similarly East at least times in total. However, the answer can be smaller than , because some of the moves required for rotation can also count towards the moves required for reaching the last row/column!
Let's assume that the final target that Tiny will hit will be in a row (we'll also want to consider the case in which he hits a column target last, and take the minimum of the two resulting answers). In this case, each of the times that Tiny moves South to rotate himself to hit a column target will also move him towards row . Therefore, he'll have to drive South exactly times. On the other hand, each of the times that Tiny moves East to rotate himself to hit a row target will also move him towards column except for the last time (because he will already have hit the final column target by then). Therefore, he'll have to drive East exactly times.
To summarize the above thoughts, the minimum number of moves required to complete the course is , plus if there's a target in the column (which we removed from the array). As such, as targets are added one at a time, all we need to do is maintain the values , , (simply the max target row so far, initialized at ), (the max target column so far), and a flag for whether or not a target exists in the column. The time complexity of this is .
Comments