TopCoder Member Round Beta 八月 25th, 2009
又是一悲剧。。。。。比赛的时候250P都写错了,1000P写不来……
TopCoder Member Round Beta DIV2 EASY 250p:需要注意的是:如果-1在前三项,那么只能用前四项推出,因为不知道是不是有第五项。我估计我就是因为这个被cha了。最保险也最简单的是a[i]=a[3]-a[2]-a[1]-a[0]+1。另外还有一个不起眼的正数条件,我也忽略了,因为样例没有负数……看来粗略读题在样例已经很厚道的TC上也不行╮(╯_╰)╭
TopCoder Member Round Beta DIV2 MIDDLE 500p:这题不难,主要是字符串处理比较麻烦,其实C++可以简单的用istringstream搞定,每个人视为一个点,在同一集合内就连一条权为1的边,然后单源最短路就行了。我偷懒敲了很短的floyed,反正不会超过20个点。
TopCoder Member Round Beta DIV2 HARD 1000p:比赛时脑子塞住了,被pattern只有50*50的条件引诱了,想了一个超复杂的算法估计没时间就没敲,事实证明我又想烦了……其实研究一下康拓尘就可以发现他的X轴和Y轴是相互无关的,因此可以把平面的问题转化成2条直线的问题。具体做法可以先检查一下pattern看看有没有所在行和列都有#自己却不是#的情况,有的直接返回0。接下来生成一维的康拓尘直线,每次挖去中间一块递归或每次a+length(a)的空格+a的递推或根据3进制的坐标有没有1决定是否挖去。然后把pattern从X和Y方向压扁成两个直线(一行/列里只要有#就标记为#,其余标记为.),分别匹配一维的康拓尘直线,答案就是X匹配数*Y匹配数
TopCoder Member Round Beta DIV1 MIDDLE 550p:虽然我是DIV2的,不过鉴于这个DIV1 550是DIV2 1000的加强版我也就提一下。DIV1 550p去掉了DIV2 1000p里pattern必有#的限制条件(我做题的时候没看到这个条件直接当成DIV1 550p来想了,我想的算法处理这个更为复杂,这也是为什么我估计时间不够的原因- -),因此必须处理pattern全为空白的情况,不过也只要改一下好了,看看一维康拓尘直线上有多少长度分别是pattern长和宽的连续 . ,答案为 长方向匹配数*(总长度-pattern宽+1)+宽方向匹配数*(总长度-pattern长+1)-长方向匹配数*宽方向匹配数