摘要: 今天下午有位童鞋写这个题用暴力得了50分,感觉十分不爽,于是过来找Kudo求救……碰巧旁边的JAF DTing…… 于是他现学现卖,写了一个Trie树来解决~ [pascal 代码] TYPE LZY=RECORD GOT:LONGINT; NEXT:ARRAY['a'..'z'] OF LONGINT; ... 阅读全文
posted @ 2011-10-28 19:10 NoRush 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 刚开始看这道题,总感觉可以对这些动物进行染色,令颜色相同的为一类。但是这样是有漏洞的。当你遇到一个没有染过色的动物,你需要给它染什么颜色呢?不能保证结果是正确的。 这道题目考查的数据结构是并查集。 用father[n],path[n]数组分别记录当前结点的祖先和到祖先的距离。 这里规定距离为0时为同类,为1时表示被祖先吃,为2时表示吃祖先。 初始时每个元素的祖先是自己,距离为0... 阅读全文
posted @ 2011-10-28 10:50 NoRush 阅读(1726) 评论(0) 推荐(3) 编辑
摘要: 这个题可以用A*算法,这里不深究。主要讲解一下普通BFS+hash判重、双向BFS。1)普通BFS+hash判重普通BFS必须hash判重。如果不判重会出现TLE的杯具(亲历……)具体是这么实现的:每次枚举可以到达的状态,如果不是目标状态,并且没有入队,那么就加入队列,直到找到目标状态为止。在这里用的Cantor展开判重。[pascal 代码]Const aim='123804765';VAR q:array[1..100000]of string; step:array[1..100000]of longint; facs:array[... 阅读全文
posted @ 2011-10-27 16:12 NoRush 阅读(1842) 评论(0) 推荐(1) 编辑
摘要: 题目要求最小变换次数,从搜索的角度讲,可以用BFS或者迭代加深。第一次写双向BFS,感觉还算标准的。判重的时候直接暴力O(tail)For循环了,不过依然很快~ Const maxn=10000; maxq=100000;Var a:array[0..1,0..maxn]of string; q:array[0..1,0..maxq]of... 阅读全文
posted @ 2011-10-27 15:34 NoRush 阅读(429) 评论(0) 推荐(0) 编辑
摘要: 废话不多说,这个题目为二分图最大匹配:把n行每一行看成一个点,共有n个点;把m列每一列看成一个点,共有m个点。当格子为灰色时,把这个格子所属的行的点与列的点连边,这样就构成一个二分图。 VAR cover:array[1..10000]of boolean; link,v:array[1..10000]of longint; map:array[1..10000,1..100]of lon... 阅读全文
posted @ 2011-10-26 20:31 NoRush 阅读(1171) 评论(0) 推荐(0) 编辑
摘要: 题目的大意是给你一些相同的立方体,共有1..N这些位置,开始每个位置上只含一个立方体,每个立方体标号1..N,然后让你执行p个操作,但只有两种操作:Move(移动)和 Count(计数)。 1)Move,输入格式M x y,意思为将当前位置为x的那些立方体堆叠到当前位置为y的那些立方体上面 2)Count,输入格式 C x,意思为查询当前标号为x的立方体下面堆叠了多少个立方体(不包含它自身) ... 阅读全文
posted @ 2011-10-26 17:06 NoRush 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 求树的最长链,用了SPFA+SLF(表示BFS就可以,作者纯属DT) [pascal 代码] Const maxn=100000; maxq=1000000;VAR a,b,e,dis,f:array[1..maxn]of longint; q:array[1..maxq]of longint; vis:array[1... 阅读全文
posted @ 2011-10-26 11:01 NoRush 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 这道题可以用树形DP,也可以直接01背包,因为每个物品的附件不能再作为主件,所以选取每个物品就只有这几种可能的情况:不选这个物品、选取这个物品、选取这个物品及它的一个附件、选取这个物品及它的两个附件。很容易地想出来这是个背包问题。 用f[i,j]表示前i件物品用了j元钱获得的最大价值(即重要度与价值的成绩最大),那么状态转移方程是 f[i,j]=max{ f[i-1,j],//不选这件物品 ... 阅读全文
posted @ 2011-10-26 08:09 NoRush 阅读(1609) 评论(0) 推荐(1) 编辑
摘要: 很早就写过这个题目,那时候看题解写的,说白了就是抄的程序…… 这几天又拿出来看,突然发现并没有想的那么难,大神勿喷…… 用f[i,j,k]表示在第i个时刻的要求中,第一个人在j位置,第二个人在k位置时的最小花费,因为第三个人一定是在上一个时刻要求的位置,所以可以去掉表示第三个人位置的那一维,用req[i]表示第i时刻要求的位置,则在第i时刻,第三个人是在req[i-1]位置上,初始化需要注意。... 阅读全文
posted @ 2011-10-25 08:16 NoRush 阅读(685) 评论(0) 推荐(0) 编辑
摘要: 最近做的字符串处理问题比较多,所以这个题目直接用的字符串来处理,不需要高精,只需要注意细节。 [pascal 代码] VAR s,pre:string; cz:boolean; i:longint;Procedure init; begin readln(s); end;Function ysf(ch:char):boolean; ... 阅读全文
posted @ 2011-10-25 08:06 NoRush 阅读(342) 评论(0) 推荐(0) 编辑