今年毕业,5月的codejam希望能够取得好点的成绩。
四个题https://code.google.com/codejam/contest/32003/dashboard
A Alien Numbers,进制转换,没啥好说的。
B Always Turn Left,走迷宫的模拟。如果往前走,当前位置左边有墙,往右走就是左边前边有墙。
记得迷宫的边界是有墙的,有的地方四面都没墙,上下,左右两块是共用一个墙的。
写这个的时候,本来打算用一个函数处理正着走和倒着走。但一懒,复制了一遍代码,没写成一个函数。结果,好几次改了一处,没改另一处。wa了好久。这样比赛的时候是肯定过不了的。
C Egg Drop,判断哪层鸡蛋摔碎。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 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。看了比赛的时候必须用快的电脑了。