Practice Contests——Practice Problems
Problem A.
Alien Numbers 进制转换,一个外星语言由字符串表示,第几位的字符表示几。例如十进制就是0123456789.要从一种语言转成另一种。
Problem B. Always Turn Left 走迷宫的模拟。如果往前走,当前位置左边有墙,往右走就是左边前边有墙。记得迷宫的边界是有墙的,有的地方四面都没墙,上下,左右两块是共用一个墙的。
写这个的时候,本来打算用一个函数处理正着走和倒着走。但一懒,复制了一遍代码,没写成一个函数。结果,好几次改了一处,没改另一处。wa了好久。这样比赛的时候是肯定过不了的。
写这个的时候,本来打算用一个函数处理正着走和倒着走。但一懒,复制了一遍代码,没写成一个函数。结果,好几次改了一处,没改另一处。wa了好久。这样比赛的时候是肯定过不了的。
Problem C. Egg Drop f层楼,d个鸡蛋,最多碎b个。判断哪层鸡蛋摔碎。f(d,b)是算d,b已知时,最大的f的。有一个关系:f(d,b)=f(d-1,b-1)+1+f(d-1.b)。假设第一次测试第x层,如果鸡蛋碎了,就用剩下的测试x下面的,这是第一项。如果没碎,就用剩下的测试x上面的,这是第三项。x自己也是1层。
算的时候,不能全部缓存,缓存d和b同时小于100的就行。
f(d,2)=(1+d)*d/2;
f(d,3)=d*(d-1)*(d+1)/6+d;
if(b==3&&d>4000)return -1;
if(b>32&&d>32)return -1;
if(b==d)return (1LL<<b)-1;
有了f(d,b)函数之后,二分查找d(f,b)和b(f,d)就行了。
算的时候,不能全部缓存,缓存d和b同时小于100的就行。
f(d,2)=(1+d)*d/2;
f(d,3)=d*(d-1)*(d+1)/6+d;
if(b==3&&d>4000)return -1;
if(b>32&&d>32)return -1;
if(b==d)return (1LL<<b)-1;
有了f(d,b)函数之后,二分查找d(f,b)和b(f,d)就行了。
Problem D.
Shopping Plan 这个是看别人写的东西才做出来的。是个动规,状态是 当前在那个位置×当前已经有的商品需要一个a[1<<15][51]矩阵来缓存。详细递推http://stackoverflow.com/questions/4735387/can-someone-explain-one-of-the-algorithms-that-solves-this-google-code-jam-probl
发现用我笔记本跑大case 340s,用个快一些的电脑114s。看了比赛的时候必须用快的电脑了。
发现用我笔记本跑大case 340s,用个快一些的电脑114s。看了比赛的时候必须用快的电脑了。
Practice Contests——Code Jam Beta 2008
Problem A.
Triangle Trilemma 三角形形状。
Problem B.
The Price is Wrong 枚举出所有最长递增字串,然后看看那个字母序最大,把没有的输出。
Problem C.
Random Route 一次弗洛伊德,求出有哪些起始点,每个起始点所有的最短路,然后把概率加起来。
Problem D.
Hexagon Game 首先要能求出六边形上任意两个点的距离,然后转化成一个最优匹配问题。用匈牙利算去求解。我是看别人的匈牙利的模板,匈牙利是最大,这里用边长设成10000-cost。
Practice Contests——Practice Contest
Problem A.
Old Magician 白的无偿去掉,最后两个黑的,结果就是放回一个白的。所以黑的单数,是黑,双数是白。
Problem B.
Square Fields 看别人的解题报告才会的。二分长度m,然后判断m能不能都覆盖。过每个点画横线跟竖线,所有正方形的左上角,落在这些线的交点处,能得到一种解。计算一个正方形能盖住哪些点。把盖住点一样的正方形去掉。然后动规,从0到2^n-1,看看盖住所有点最少要几个正方形,如果小于要求就可以。
Problem C.
Cycles 看的这里http://stackoverflow.com/questions/4759955/how-to-solve-a-google-code-jam-problem。过0个不能用的边的路-过1个的+过2个的-过3个的+过4个的...有一个需要注意的地方就是要判断不能走的边组成一个环的情况,如果这样,那没有过这些边的回路。