So, with 1000 having already advanced there probably wasn’t quite so much competition this round, but it definitely seemed to be a slightly harder round, with only 320 perfect scores. Specifically the third problem large input was a bit difficult if you didn’t have experience with that kind of problem before.
In the end the cutoff was the first 2 problems in a decent time.
Q1) Given a set of characters made out of the the letters in the English words for the digits zero through nine, determine what the original digits were, in non-descending order.
A1) This was a fairly straight forward, if potentially tedious to code problem – you just have to identify the correct order to try removing the words from the distinct count of each letter in order to avoid getting into a dead end. One such order is (Z)ERO, T(W)O, FO(U)R, SI(X), EI(G)HT, (O)NE, (T)HREE. (F)IVE, SE(V)EN, N(I)NE, . Each of the letters in brackets is the last time that letter occurs reading left to right, so removing in that order obvious works. I like this particular ordering because its the even digits followed by the odd digits, each in ascending order.
Q2) Given a pair of numbers that have been obscured by replacing some of the digits with question marks, and may also be zero padded, determine the way to replace the question marks which results in the minimal difference, breaking ties by minimizing the first value and further by minimizing the second value.
A2) So the contest analysis mentions that this can be done in O(N), which I found interesting, but I’ve not managed to solve yet. The O(N^2) solution is consider the replacement of question marks to have 3 phases. Phase 1 you try to make the numbers equal, Phase 2 you introduce a minimal single digit difference, Phase 3 you try to maximize the difference in the opposite direction to the difference introduced in Phase 2. You just iterate over all of the possible places for Phase 2, including not every reaching it. For each possible phase 2 location you can either try and make the second larger, or the first larger, but that only doubles the total number of passes, so its still O(N^2). You can try and optimize further by aborting when phase 1 fails to make equal, but its not trivial to know when not to bother trying with phase 2 – I think you need some kind of pre-processing step to work that out in order to get to the O(N) solution.
Q3) Given ordered pairs of words, determine the maximum subset which can be made entirely out of the first and second word sets of the inverse of that subset.
A3) I immediately recognized this as a graph problem. I mistakenly first assumed that the answer was number of edges minus the minimum spanning tree, but the minimum spanning tree was the wrong concept. Not too long after that I realized it was a bipartite graph problem. With that I simply assumed that TMD.Algo had the solution and that the answer was the number of edges minus something to do with calculating the bipartite matching. In the end its number of edges minus the bipartite maximal independent set. Which doesn’t make a lot of sense at first glance, since you want number of edges minus the minimal edge cover size – but for a bipartite graph the maximal independent set is equal to the minimal edge cover size. The minimal edge cover is equal to the size of the maximum matching plus one for each vertex not in the maximum matching. Number of vertexes not in the maximum matching is to number of vertexes minus twice the maximum matching. Add on the size of the maximum matching and you get number of vertexes minus the maximum matching, which is the same formula as the size of the maximum independent set.