### kingofnumbers's blog

By kingofnumbers, history, 5 years ago, Hi,

This is to remind you that Google Code Jam Round 1B will be tomorrow at this time, Top 1000 will advance to 2nd round.

let's discuss the problems after the contest.

Good luck. Comments (51)
 » 5 years ago, # | ← Rev. 2 →   How to register the contest?Edit: "Coding has commenced! Registration is now closed." <== Okay :/
•  » » You can participate if you qualified during the Qualification Round.
 » starts in 10 mins.GL & HF
 » Very Bad round for me . I didn't understand why my solution fails on B . B had 40+ % accuracy. I tried to be Greedy it failed( At the back of my mind I had a kind of proof).Then I did a simply DP on integers but yet I recieved many WAs. Code . Can someone provide some trivial test ? I think my understanding of the statement is wrong!
•  » » Well I solved in on small test, but failed on big one. Not sure why — maybe my solution is wrong, or just implementation (it is kinda complex, easy to make a mistake somewhere).
•  » » Small passed. I did it by brute force.
•  » » Input:1?6 31Expected Output:26 31
•  » » » How to solve second question for large input.
•  » » » » Go from left to right and try to assign digits either equal, or differing at most by 1 (to minimize the distance). If at some point prefixes differ, then you have to assign the rest free digits to 9 for the string with smaller prefix and assign all free digits to 0 for the other string. Otherwise, if you assign equal digits or they are given equal, just recurse further.Also, if you assign equal digits when both strings have "?" in this position, check only 0 0, it will minimize both scores.In such way the recursion never branches (or you can think that it has branches of length 1).
•  » » 1 ?5 10 This was in the test cases for small.
 » How to do C small?
•  » » 5 years ago, # ^ | ← Rev. 2 →   You can bruteforce it with simple recursion (trying to pick all possible combinations of valid participants). With careful implementation it passes.
•  » » for Csmall write a bitmask DP by storing a mask of topics already used. Complexity O(2N * N * N).
•  » » You can use dynamic programming. The state is the set of all already placed topics (represented as binary mask). To make a transition, just iterate through all possibilities to place a new topic, and check if it is faked. The complexity is O(2n * n2)
•  » » Split topics into 2 sets — fake and real. Then for each fake topic check if there are first and second word in 'real' topics set. Try all possible splits, 2^N for each test.
•  » » It's simple: just check all the 2^n masks, O(n^2) for each mask. How to check it? For each topic marked as "fake" in this mask you should check whether the first word appears in the list of unfaked topics. Same for the second word. If both words do not appear — this mask can't be possible answer.
•  » » My brute-force solution with complexity O(2n * n) following: Try all possible 2n mask, where 1 means, that topic if fake. The answer is maximum of bitcount(mask) where for each fake topic there are not fake topics with same first and second words. This check procedure can be done with O(n) complexity.
•  » » I did it with minimum edge cover. Build a bipartite graph and each entry is an edge connecting two vertices from the two sets. The answer is the total number of edges minus the minimum edge cover.
 » Analysis can be found here.
•  » » 5 years ago, # ^ | ← Rev. 2 →   I have a different solution to C than the analysis, and it does not involve being greedy at any stage. Consider the example they gave: HYDROCARBON COMBUSTION BIOMASS COMBUSTION QUAIL COMBUSTION QUAIL BEHAVIOR QUAIL CONTAMINATION GROUNDWATER CONTAMINATION GROUNDWATER HYDROLOGY Now, instead of finding minimum edge cover on the top graph, I simply find the maximum flow in the network below. The idea behind this is as follows. Let a single unit of flow represent a fake topic. Then it has to go through the middle edge, and only a single unit of flow can pass there. However, we have the additional restriction. Every word has to be in at least one legit topic. To enforce that the capacity of edges representing the words are their frequency minus one.
•  » » » Can you show how you have enforced last condition by subtracting capacity by one? What is the final answer if flow is F. Isn't it F?
•  » » » » The topics contained in the flow found here are fakes, while the remaining topics are real.By reducing the capacity of each word by one, you ensure that each word has at least one unused topic remaining after the fake flow is constructed, i. e. that each word has at least one real topic.Imagine that after finding the fake flow, you subtract the fake flow from the graph, remove the word capacity bounds (but keep the topic capacity bounds) and find the maximum flow in the resulting graph. Then you’ll get the real flow, and it will incorporate all remaining topics due to the unbounded word capacities. By ensuring that this graph contains at least one topic involving each word, you ensure that the real topics cover all words, which is good. Conversely, if you hadn’t reduced the word capacities by one before finding the fake flow, the fake flow might have taken up all topics involving a particular word and you’d be left with no real topic covering that word, which would be bad.Of course, you want to minimize the number of real topics, so you want to minimize the number of edges remaining after subtracting the fake flow (because each remaining edge corresponds to a real topic), so you want to maximize the number of edges in the fake flow, so you want the fake flow to be maximal.
•  » » » I don't understand why they mentioned greediness. The answer is simply n — (number of different first words) — (number of different second words) + (size of maximum matching).
•  » » » » I'm guessing it's because rather than explaining how to get the size of the edge cover, they also wanted to explain how to construct the edge cover itself.
 » when I see those large number of participants in GCJ I wonder are there a lot of competitive programmers who don't participate neither in CF nor in TC but only in GCJ?
•  » » I know a lot of guys who were active at CF/TC/CodeChef in past, and nowadays only participate in annual competitions like FHC, TCO, GCJ etc. A lot of people are active at online judges while preparing for ICPC, and then only participating in major competitions later.And also if you are considering active contestants, still a lot of them are only attending some small percentage of CF/TC contests, while trying not to miss events like GCJ.
•  » » » Also GCJ is quite friendly for languages like Python or even Sage, since you run everything locally and the time limit is a few minutes.
•  » » » but this reasoning is still not enough to cover the very large numbers of participants in GCJ, if you look on the number of participants of qualification round it is around 27,000 and 22,000 out of them qualified to round 1, which is even more than total number of accounts in CF without even removing the fake accounts :D also looking at the difficulty of today's round and the number of points required to qualify to 2nd round I can say that one need to be div1 coder in CF to be able to qualify to 2nd round (or have equivalent skills). 3,000 coders will advance to 2nd round which is more than the number of div1 accounts in CF, again without removing fake accounts :D
•  » » 5 years ago, # ^ | ← Rev. 2 →   I think one of the main reasons is Googles brand (second place in Forbes rating after Apple). Every programming contest is positioning as a place for hiring of coders and about every coder wants to work at Google (of course the brand is not the only reason for that). So in GCJ are participating a lot of users who are not competing in other contests at all.
•  » » » Google become most valuable company in the world not long time ago http://qz.com/607396/google-has-officially-dethroned-apple-as-the-worlds-most-valuable-company/
•  » » » » Actually I'm talking only about the Google brand. It seems I was wrong and Google on the third place according to Forbes rating.
 » HOW to solve the 2nd question for large input.
 » Very nice problems, as usual on GCJ.
 » Could someone upload a correct solution for the large practice data for task B? I've implemented mostly the same thing the analysis said, and the output does seem correct for the cases I can easily check by hand, but it's apparently incorrect for some. Probably a corner case...
 » vi find(int freqs[]){ vi r; while(freqs['Z'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0 && freqs['R'-'A']-1 >= 0 && freqs['O'-'A']-1 >= 0){ freqs['Z'-'A']--; freqs['E'-'A']--; freqs['R'-'A']--; freqs['O'-'A']--; r.PB(0); } while(freqs['O'-'A']-1 >= 0 && freqs['N'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0){ freqs['O'-'A']--; freqs['N'-'A']--; freqs['E'-'A']--; r.PB(1); } while(freqs['T'-'A']-1 >= 0 && freqs['W'-'A']-1 >= 0 && freqs['O'-'A']-1 >= 0){ freqs['T'-'A']--; freqs['W'-'A']--; freqs['O'-'A']--; r.PB(2); } while(freqs['T'-'A']-1 >= 0 && freqs['H'-'A']-1 >= 0 && freqs['R'-'A']-1 >= 0 && freqs['E'-'A']-2 >= 0){ freqs['T'-'A']--; freqs['H'-'A']--; freqs['R'-'A']--; freqs['E'-'A']-=2; r.PB(3); } while(freqs['F'-'A']-1 >= 0 && freqs['O'-'A']-1 >= 0 && freqs['U'-'A']-1 >= 0 && freqs['R'-'A']-1 >= 0){ freqs['F'-'A']--; freqs['O'-'A']--; freqs['U'-'A']--; freqs['R'-'A']--; r.PB(4); } while(freqs['F'-'A']-1 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['V'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0){ freqs['F'-'A']--; freqs['I'-'A']--; freqs['V'-'A']--; freqs['E'-'A']--; r.PB(5); } while(freqs['S'-'A']-1 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['X'-'A']-1 >= 0){ freqs['S'-'A']--; freqs['I'-'A']--; freqs['X'-'A']--; r.PB(6); } while(freqs['S'-'A']-1 >= 0 && freqs['E'-'A']-2 >= 0 && freqs['V'-'A']-1 >= 0 && freqs['N'-'A']-1 >= 0){ freqs['S'-'A']--; freqs['E'-'A']-=2; freqs['V'-'A']--; freqs['N'-'A']--; r.PB(7); } while(freqs['E'-'A']-1 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['G'-'A']-1 >= 0 && freqs['H'-'A']-1 >= 0 && freqs['T'-'A']-1 >= 0){ freqs['E'-'A']--; freqs['I'-'A']--; freqs['G'-'A']--; freqs['H'-'A']--; freqs['T'-'A']--; r.PB(8); } while(freqs['N'-'A']-2 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0){ freqs['N'-'A']-=2; freqs['I'-'A']--; freqs['E'-'A']--; r.PB(9); } return r; } Can somebody tell me what is wrong with this logic for problem A? (Besides the fact it is quite cumbersome), thanks
•  » » Also I have looked at a few solutions but I still dont get the idea those people have taken