随笔分类 - SRM144
摘要:图论题,题目重新叙述为:一棵树从根出发遍历完所有节点的最短总路径之和令 p(x) 表示节点 x 到根的路径长,sum 表示所求总路径之和,则:summin=2×∑iductLengthi−max{p(x)}证明最优解与深度优先遍历有关,先证明如下问题:若最终遍历还要回到根节点,则最短路径之和 sum2min 就是深度优先遍历的路径之和 deepsum利用归纳法可以证明深度优先遍历路径和deepsum=2×∑iductLengthi若最终遍历回到根节点,则任何一条边必然
阅读全文
摘要:一般编程题 1 class Time: 2 def whatTime(self, seconds): 3 h = seconds // 3600 4 m = seconds % 3600 // 60 5 s = seconds % 60 6 return "%s:%s:%s" % (h, m, s) 7 8 # test 9 o = Time()10 11 # test case12 assert(o.whatTime(0) == "0:0:0")13 assert(o.whatTime(3661) == "1:1:1"...
阅读全文
摘要:这是一道很有意思的图论题,分析本问题之前必须先理解一笔画问题的原理,不难扩展出以下定理:若一个连通无向图的奇顶点个数为n(1) 当n为0时,图可以一笔画(且可以构造一个回路)(2) 其他情况,图可以n/2笔画(注意n一定为偶数)对于多联通分量的无向图,每个联通分量单独计算k笔画的情况,最后累加即可对于本题,将线段看成图的边,端点和交点看成图的顶点,画n遍转换为每条边重复出现至n次,而:笔抬起的次数=笔画数-1,这样题目就转化为下面这样的问题:给定一个图,求最少可以几笔画完,每条边不能重复也不能遗漏模型建好了,但是在编程计算的过程中还有以下难点:1. 如何处理互有覆盖(overlap)的线段?题
阅读全文
摘要:排列组合的问题,对于不同的情况分别考虑即可,引入定义:P(n,r)n个元素集合的r-排列的个数C(n,r)n个元素集合的r-组合的个数M(k,r)k种元素多重集的r-组合个数, M(k,r) = C(r+k-1,r)共有4种情况sortedunique总数truetrueC(choices,blanks)truefalseM(choices,blanks)falsetrueP(choices,blanks)falsefalsechoices^blanks(乘方)剩下的就是排序等基本的程序操作了,注意精度问题 1 class Lottery: 2 def sortByOdds(self,...
阅读全文
摘要:一般的编程题,注意考虑边界情况和各种约束的完备性,详情见测试用例 1 class BinaryCode: 2 3 def decode(self, message): 4 enc = [int(ch) for ch in message] 5 return (self._decodeBy(enc,0), self._decodeBy(enc,1)) 6 7 def _conact(self, nlist): 8 s = '' 9 for i in nlist:10 s = s + str...
阅读全文