[Problem Description]
When Sergeant Argus's army assembles for drilling, they stand in the shape of an N by Nsquare grid, with exactly one soldier in each cell. Each soldier has a certain height.
Argus believes that it is important to keep an eye on all of his soldiers at all times. Since he likes to look at the grid from the upper left, he requires that:
Although no two soldiers in the same row or column may have the same height, it is possible for multiple soldiers in the grid to have the same height.
Since soldiers sometimes train separately with their row or their column, Argus has asked you to make a report consisting of 2*N lists of the soldiers' heights: one representing each row (in left-to-right order) and column (in top-to-bottom order). As you surveyed the soldiers, you only had small pieces of paper to write on, so you wrote each list on a separate piece of paper. However, on your way back to your office, you were startled by a loud bugle blast and you dropped all of the pieces of paper, and the wind blew one away before you could recover it! The other pieces of paper are now in no particular order, and you can't even remember which lists represent rows and which represent columns, since you didn't write that down.
You know that Argus will make you do hundreds of push-ups if you give him an incomplete report. Can you figure out what the missing list is?
The first line of the input gives the number of test cases, T. T test cases follow. Each consists of one line with an integer N, followed by 2*N-1 lines of N integers each, representing the lists you have, as described in the statement. It is guaranteed that these lists represent all but one of the rows and columns from a valid grid, as described in the statement.
For each test case, output one line containing Case #x: y
, where x
is the test case number (starting from 1) and y is a list of N integers in strictly increasing order, representing the missing list.
1 ≤ T ≤ 50.
1 ≤ all heights ≤ 2500.
The integers on each line will be in strictly increasing order.
It is guaranteed that a unique valid answer exists.
2 ≤ N ≤ 10.
2 ≤ N ≤ 50.
Input |
Output |
1 3 1 2 3 2 3 5 3 5 6 2 3 4 1 2 3 |
Case #1: 3 4 6 |
In the sample case, the arrangement must be either this:
1 2 3
2 3 4
3 5 6
or this:
1 2 3
2 3 5
3 4 6
In either case, the missing list is 3 4 6
.
[Problem Analysis]
It is tempting to think it in a rather complicated way. However, the solution is very simple, if you observe a very important property. That is: each soldier appears exactly twice in your files, once when you record in row and once when you record in column. So, each number must appear even times in the files. If one file is missed, what happened? If you lost the file recording a row, each number will have appeared once in the columns. These numbers will appear for odd times! What's more, only these lost numbers appear in odd times! Problem becomes easy, since we just need to find the numbers which appears for odd times in the left files. Remember to sort them before output! The solution in Python is shown below.
[Problem Solution]
T = int(raw_input())
for t in xrange(1, T+1):
N = int(raw_input())
ls = []
for _ in xrange(2*N-1):
l = [int(i) for i in raw_input().split(' ')]
ls.append(l)
nums = []
for l in ls:
nums += l
c = Counter(nums)
res = []
for i in c:
if c[i] % 2 == 1:
res.append(i)
res.sort()
res = [str(i) for i in res]
res = ' '.join(res)
print 'Case #{}: {}'.format(t, res)
If one way is too long and obstructive, just have a rest and think in another way. There is an Chinese poetry illustrating this quite appropriately: "山重水复疑无路,柳暗花明又一村"是也。
[Source]
https://code.google.com/codejam/contest/4304486/dashboard#s=p1