04 2012 档案
摘要:昨天Google Code Jam 2012 Round 1A。由于没有注意到它只进行两个半小时,而不是从你开始做开始计时,直接错过了参加比赛。后来看了一下题目,新题目还是比较有意思的,下面就给出各题的参考和实现。A. Password Problem 第一道题,跟概率有些关系。先理解一下题目意思。 一个人在输入一个很长的密码,输到一半时觉得前面可能有地方错了,那么他有三种选择, 1、继续输入,提交,如果没有错,ok。如果有错误,那么重新输入,这一次一定不会输错; 2、按退格键若干格,然后完成输入并提交。新输入的部分是不会出错的。如果错误被空格键清除,那么提交通过,否则需要重新...
阅读全文
摘要:动态规划(Dynamic Programming)可以用来非常有效的解决许多搜索优化问题。这类问题都有相同的地方,原问题可以分解为子问题,子问题中有重复的部分(overlapping subproblem),或者原问题的最优解与子问题的最优解具有相同的结构(optimal substructure),将规模较小的子问题的最优解扩展为规模较大的问题的最优解。它之所以有效,是因为它采用自底向上的方式递推求值,并把中间结果存储起来以便以后用来计算所需要求的解。 动态规划虽然比较容易理解,在应用过程中可以分为两步,先找出子问题的最优结构,然后找出子问题的最优解向规模较大子问题的最优解扩展。但在具...
阅读全文
摘要:今天打开cnblogs,看到园龄1年,才发现自己来这里这么长时间了。 从开始想到要建个Blog,在CSDN和cnBlogs中间选了好久,到决定使用cnBlogs,然后开始写些东西,似乎还没过去多久,却竟然已经一年了。 数数Blog上的文章,如果不考虑这个月把Gooogle Code Jam上的练习题贴上来,也就二十多篇,一开始的时候写了几篇,后来课程比较多,想等暑假和寒假来整理一些内容,结果在假期里没有什么动力去整理那些东西,园子似乎要荒芜下来。直到这次Google Code Jam,想练习一下,于是把做的东西贴出来了,强迫自己把这些练习题做完。虽然这样,却还是有几道题还没有贴出来,因...
阅读全文
摘要:这道题是Round 1B 2010的第二道题,第一次看的时候,没看懂题目意思,这一次总算是把题目看懂了。看懂之后,才发现,原来如此简单。 先说一下题目意思,在一条非常narrow的路上,有一群chicks,以各自的速度朝Barn前进。如果后面一只撞上前面的一只,就要以前面一只的速度前进。现在有一个arm ofcrane,机械臂,可以瞬间交换两只chick的位置,如果一只速度比较快的A被前面一只B挡住了,就可以交换一下,那么A到B的前面去了,而不用以B的速度前进。要求在一定时间T内,有K只到达barn。问是否可能,如果可能,需要交换的次数最少是多少。 在题目意思理解清楚之后,就会发现,如...
阅读全文
摘要:看到一个介绍Bottle的文章,觉得很有意思,所以到处搜罗了一些有意思的东西,总结如下。 在浅谈五大Python Web框架(http://www.cnblogs.com/babykick/archive/2011/11/28/2265920.html)中介绍了几种Python的Web框架,然后又看了一下Web框架比拼测评(http://www.cichui.com/the-great-web-framework-shootout/),觉得Bottle和Flask很有意思,所以想了解一下。 从下面的示例代码看看,你会喜欢哪一种呢?web.pyimport web urls =...
阅读全文
摘要:Python里面字符串的操作很方便,比如split,strip。在C++里,string提供了length,得到字符串的长度,append,在字符串末尾添加字符串,push_back,在字符串末尾添加字符,insert,指定位置处插入字符串,或n个字符,assign,对字符串赋值,可以是某个字符串的从某个位置开始的多少个字符,也可以是常量字符串,也可以是指定个数的n个字符,replace,用某个字符串,或者某个字符串的从某个位置开始的多少个字符,替换原字符串从某个位置开始的多少个字符,erase,擦除指定区间的字符,swap,两个字符串的内容交换,但是没有提供split和strip,strip
阅读全文
摘要:C++文件操作。C++中引入了stream,相关的头文件<fstream>,支持文件输入与输出,还有两个<ifstream>和<ofstream>,分别支持文件读入和写入。文件的打开与关闭fstream作为一种对象,它的操作由构造函数,成员函数来完成。fstream ( ); explicit fstream ( const char * filename, ios_base :openmode mode = ios_base::in | ios_base::out ); fstream f("input.txt",fstream::in
阅读全文
摘要:前几天一直用Python做google code jam的练习题,文件操作很方便。如果用C/C++去做的话,那么首先要解决的就是文件操作。于是整理了一下文件操作的函数用法。先来看看C的文件操作。FILE* stream相关的头文件stdio.h,就可以使用与文件操作相关的数据类型和函数。文件的打开与关闭首先,定义文件指针,FILE* f,用fopen(const char* filename,const char* mode)来打开文件,用fclose(File* p)来关闭文件。文件的打开方式,"r"表示读,"w"表示写,"a"表示
阅读全文
摘要:继续Round 1C 2009第二道题,多个物体的质心到原点最小距离。最后并且给出了质心的公式,x=sum(xi+xvi*t),...每个物体的质量都一样,就不用考虑x=sum(mi*(xi+xvi*t))。最后距离的平方d=x^2+y^2+z^2=at^2+bt+c,一个关于t的二次多项式,求t>=0时的最小值。应该不难的,只是数值计算过程中会出现一些奇怪的问题。比如已经判断b^2-4ac>=0,sqrt(c-b^2/4a)的时候却提示出错。另外,需要分情况讨论求最小值。b>=0的时候,如果a很小,看作一次式,那么d是增加的,在t=0时取最小值,如果a不算小,那么是二次式,
阅读全文
摘要:连续碰到几道题搞不定,想找一道简单一点的,来增加一点成就感。于是看了这道题,第一道题,虽然是C轮的,应该不会太难吧?但看完题就知道自己错了,为什么连题都看不懂呢?无奈,求助答案吧。答案好简单,连Python代码都给了。还是简单分析一下吧。先来解释题目意思,题目给出一个字符串,包含a-z0-9,表示一个数字,这个数字的基数base可以是任意的,要求选一个基数,使字符串表示的数最小,并且第一位不为0。怎样可以使基数最小呢?base=10,即十进制,有0-9种表示0-9,也可以用a-j表示0-9,反正就是要10个不同的字符。那么字符串的基数最小就可以是字符串中不同字符的个数。而且要使表示的数最小,那
阅读全文
摘要:之前没搞定的几道题先跳过了,来做做简单的吧。Round 1A 2010,第一道题,Rotate,join-K的游戏,不太了解,略过。按照题目意思,将数据先顺时针转90度,然后由于重力作用,有空白的地方会被上面的棋子落下来填上。然后如果出现一定数目的同一种颜色的棋子在一条线上,那么该颜色的一方获胜。与五子棋类似,只是它这里添加了旋转和重力的问题。其实旋转和重力不是大问题,顺时针旋转90度,然后重力填补空白,将相当于水平方向上棋子向右落来填补空白。是否旋转了90度与最后谁获胜没有关系。那么如何填补右方的空白呢?strip(".")可以去掉字符串中的".",但
阅读全文
摘要:继续Round 1B 2010。第二道题没理解题目,第三道题题目可以理解,但是算法又折腾了好久。还是先看第三道题吧。给定一个集合S={2,3,...n},它的子集S' 满足性质:n在S'中是第k个元素,那么k应该也在S'中,同样地,k是第k'个元素,那么k'应该也在S'中,经过有限步,k=1,不在S'中,称n对于S'是Pure Rank。那么给定一个n,求S'的个数。在Content Analysis中,给除了动态规划算法的算法。我怎么觉得好多题都是动态规划,我正好不太懂态规划。看看具体算法如下,如果n是一个集合S'
阅读全文
摘要:前几天一直卡在Making Chess Board那道题上,目前还没有完全解决,打算先跳过。这次是Round 1B 2010的第一道题,还算比较简单,具体如下。在Linux系统中,创建文件夹需要使用mkdir,如果父文件夹不存在则需要先创建父文件夹,题目先给出一组已经创建的文件路径,然后给出一组需要创建的文件路径,计算最少的mkdir的次数。当然,没有使用mkdir -p。直接的想法就是,对已经创建的路径进行hash,放入dict,所以读取一个已经创建的路径的时候,先查看整个路径是否已经在dict中,如果不在,将其添加到dict中,剥掉最后一层,继续检查路径是否在dict中,如果在,则结束。同
阅读全文
摘要:Round 1C 2010的最后一题。C轮果然还是有些难度的,虽然我觉得第一题比较简单。这题是给定一大块板子,上面有黑块和白块,跟Chess Board上面的方格类似。要求将上面存在的Chess Board剪下来,从大到小。直接的方法,size从最大到最小,扫描整个板子,选取size大小的块进行匹配,如果满足,那么将这一块剪下来。存在的几个问题,1. 数据的读取给定的是16进制数据,每一位表示一个块,0和1表示是黑块还是白块。需要将其转化为一位一位的形式。这里采用的方法是bin(ord(s)-ord("A")+10),先把A~F转化成数字,然后转化成二进制数,再把二进制数的
阅读全文
摘要:Round 1C 2010,C轮的测试题了。本以为难度会加大,不过第一题还是比较简单的。Rope Intranet,统计绳子的交点个数。算法很直接,遍历所有的绳子,累计它与剩下的绳子的交点的个数。代码如下:#!/usr/bin/python#encoding:UTF-8#Filename:RopeIntranet.pyimport sysdef compareWire(a,b): if (a[0]<b[0] and a[1]>b[1]) or (a[0]>b[0] and a[1]<b[1]): return 1 else: return 0inname...
阅读全文
摘要:Welcome to code jam,Qualification Round 2009的第三道题。题目的大概意思是,给定一个字符串,要求找出里面welcome to code jam的次数,给出最后四位数字。只要这19个字符按顺序出现了,就可以算作一次,不管是否被其它字符隔开。在Contest Analysis中,给的方法是动态规划。在思考了一小会没有想到解法之后又直接看答案了。。。动态规划的思想是,cnt[i,j]表示在给定的字符串的前i个字符中,出现welcome to code jam的前j个字符的个数,那么处理i+1个字符时,如果第i+1个字符是对应的第j个字符,那么cnt[i+1]
阅读全文
摘要:Water Sheds,这是Qualification Round 2009的第二道题,还没有想到好的解决办法的时候,直接看了参考解答。参考解答研究了好久才看明白,看来还需要加强练习。先来看看题目意思,给定一个mxn的矩阵,每个位置是一个海拔值,相当于是一份地图,要求根据水流给这份地图进行标注,水流动的规则是,1. 对任一个位置,至多流向它的四个邻居中的一个,邻居就是东南西北方向的四个位置;2. 如果相比于四个邻居,它本身的海拔最低,那么水不流动,这个位置称为sink,盆地;3. 否则,水流向海拔最低的一个邻居;4. 选择海拔最低的邻居的顺序是,North,West,East,South,即北
阅读全文
摘要:进入Qualification Round 2009的试题,第一道题Alien Language,模式匹配的问题,既然选择了Python,可以使用Regular Expression正则表达式,那就是太简单了。主要问题就在于把给定的pattern转换为regular expression,把"("和")"换成"["和"]"就可以了,代码如下:#!/usr/bin/python#encoding:UTF-8#Filename:AlienLanguage.pyimport sysimport reinname = &q
阅读全文
摘要:Numbers,这道题是Round 1A 2008的最后一道题,给定n,要求计算(3 + √5)^n整数部分的最后三位数字,如n= 5, (3 + √5)5= 3935.73982,那么结果就应该是935,不足三位数字,则补零。(3 + √5)n+1与(3 + √5)n有递推关系,用an+bn√5表示(3 + √5)n,那么α(n + 1)= (3 + √5)(an+ bn√5) = (3an+ 5bn) + (3bn+ an)√5,可以写成矩阵形式,在contest analysis里面也给出了Python的解题代码,如下,#!/usr/bin/python#encoding:UTF-8#F
阅读全文
摘要:还是MilkShakes的问题。今天看了一下Contest Analysis,按照提示总算得到了较好的结果。在Contest Analysis中,给出了算法的描述,如下:1. 初始化flavor choice全为0,检查customer的满意情况;2. 对于不满意的customer,如果他只喜欢unmalted的,但是所有的已经malted,那么该customer不可能被满足,给出IMPOSSIBLE;3. 对于不满意的customer,如果他只有一种喜欢的malted,那么将对应的malted,回到步骤2;4. 如果没有不满意的customer,那么就是得到了解。在用Python实现的时候,
阅读全文
摘要:继续MilkShakes问题。之前是使用穷举搜索的方法,能保证结果的准确,但是效率较低,对于large case无法完成测试。后来想用贪心算法来实现。贪心策略是,统计flavor处于malted或unmalted出现的次数,取unmalted出现次数最多的flavor,这样被迫出现的malted的flavor次数会少;取malted出现次数最多的flavor,使得被迫出现malted的次数减少。在使用贪心算法之前,可以对只有一种选择的customer进行满足,确定一部分flavor。如果不能满足,则直接得到结果。代码如下:#!/usr/bin/python#encoding:UTF-8#Fil
阅读全文
摘要:MilkShakes,这道题有些难度,自己水平太差,还没有找到好的方法来解决。对于small case,得到了正确的答案。先来看看题。题目的大概意思是,给一些不同flavor(风味)牛奶(1,..N),可以是malted(1),也可以是unmalted(0),但是每一种牛奶只能是malted或者unmalted;有很多顾客,每个顾客喜欢的不一样,也可能喜欢多种。要求给出各种牛奶是否malted,能够满足所有顾客都有自己喜欢的flavor,并且malted的数量尽可能少。具体内容参考http://code.google.com/codejam/contest/32016/dashboard#s=
阅读全文
摘要:继续Python练习。这次的题很简单的。这次的题是Minimum Scalar Product,大概意思是给你两个数组va和vb,两个数组的元素对应相乘,然后求和,要求和最小,在数组元素顺序可以调整的时候。这里主要用到一个不等式,x和y两个升序的数组,那么sum(x[i]*y[i])>=sum(x[i]*y[n-i]),这个不等式在元素中有负数时也是成立的,所以问题的解法就很直接了。Python里面可以直接调用sort和reverse函数,先将两个数组va和vb排序,然后将其中一个reverse一下,在把元素对应相乘,就得到最小值了。代码如下:#!/usr/bin/python#enco
阅读全文