- 博客(11)
- 收藏
- 关注
原创 PKU3254 corn fields
这是一道基于状态压缩的动态规划,但应该是这类题中最简单的了。 我们按行递推,将每行的状态用二进制表示出来。这就要求我们进行预处理,记录每个状态上一行的可行状态。这样的动态规划时间复杂度极低。program corn_field;const pnum=1000000000; maxn=12; maxm=12;type pointer=^node; node=record data:long
2010-10-31 18:27:00 421
原创 PKU3269 build a new barn
<br />首先我们了解到本题在一维情况时就是著名的士兵排队。当然由于汉密尔顿距离的定义,我们依旧可以如法炮制!<br /> 但是我通过无数次WA法相这道题里有一些细节值得考虑。首先,题目描述中没有是要求选择点不是提供的n个点之一,最开始看反了,囧了……其次,我们求出符合的点后发现会出现ans=0的情况。所以我们还要讨论求出的部分的边界上某个点的四周。 <br /> <br /> program Building_A_New_Barn;const deltax:arr
2010-10-30 16:15:00 313
原创 PKU1201 intervals
<br /> 这是一道差分约束的图论题目,涉及到SPFA算法。<br /> 首先,来了解一下所谓差分约束系统。如果我们有一系列的Ax<=b的约束条件,我们就可以通过建立约束图,寻找最短路或最长路得方法来求解这类问题。对于一个约束条件x[j]-x[i]<=k,那么我们就需要连接一条从i到j权值为k的边。我们一旦得出了一条最短路径就是一个可行解,出现了负权回路就是没有可行解。如果我们有一个可行解,那么在这组可行解的每个数据上加上相同的数,也是一个可行解。<br /> 这样,对
2010-10-29 09:11:00 410
原创 PKU2823 sliding window
这是一道经典的数据结构题,可以用来为多种数据结构入门或者热身。它涉及到的数据结构有单调队列、堆结构、线段树。后两项应该是大家比较熟悉的,所以今天做讲解的是单调队列。 我们以最小值的情况为例。对于两个元素a[i]和a[j],我们假设i 根据均摊思想,单调队列的时间复杂度为O(n),应该是最优的。 具体比对请见代码!【单调队列】program sliding_window;var nummax,nummin,quemax,quemin,ansmax,
2010-10-24 13:38:00 906
原创 PKU1180 Batch Scheduling
<br /> 如果说想在这道题目上拿部分分(如果有这么一说)是很简单的。但是O(n)满分算法可不是一下就搞出来的。<br /> 这道题需要用到斜率优化。下面就用这道题举个例子吧!<br /> 首先我们列出本题的状态转移方程。对于这个方法我们需要倒推这个方程。(但是即使正推也有能AC的低复杂度算法)<br />f[i]=f[j]+cost[i]*(s+time[i]-time[j])<br /> 我来解释一下:f[i]表示从第i个开始的最小代价,cost[i]和
2010-10-21 18:37:00 402
原创 PKU1703 find them catch them
<br /> 简单的并查集,但是我少打了个句号,于是无数次WA……<br /> 并查集里的比较常见的题型,就是记录一个根节点和一个对立根节点。<br /><br />program Find_them_Catch_them;var father,pair:array[0..100000] of longint; n,m,i,t:longint;procedure prework;var i:longint;begin rea
2010-10-06 12:30:00 308
原创 SPOJ0196 musketeers
经典的线性动态规划,但是状态转移并不难。 用g表示相互的胜负关系,用f表示是否可以相遇,那么当推出f[i , i+n] 时,就说明,i可以获胜。状态转移方程为f[i,j]:=f[i,k] and f[k,j] and (g[i,k] or g[j,k])。program musketeers;var f,g:array[0..200,0..200] of boolean; ans:array[0..200] of longint; i,t,sum
2010-10-06 12:23:00 306
原创 RQNOJ520 trade
NOIP2009第三题也。 这道题我觉得可以用所圈加拓扑排序吧?尽管我没有尝试……我发现这种两次SPFA是很好的思路。对于这种标号修改型的数据来说基本都可以用SPFA来解决,代码也很短小。 总体思路在下面的代码中很清晰——更新从1开始的路径上的购买时的最小值,再更新以n结束的路径上的卖出时的最大值,它们的差值的最大值就是我们的答案!program trade;type rec=record u,v:longint;
2010-10-06 09:04:00 339
原创 PKU1167 the buses
<br /> 这是我印象中敲的第一个dfs-id吧……弱弱地撒花……<br /> 题目大家都清楚,我觉得在中国是个信息学的书上都有……注意搜索顺序!头脑中有一棵搜索树的话,就不难发现,如果搜索当前车属于原有线路还是新线路,随着树深的增加,枝条就越多,剪枝的效果就越好!<br /> 迭代加深就是比普通的深度优先搜索多了几行代码而已,用于限制树的深度。而且得到的第一个可行解就是最优解!在状态空间比较庞大,或不便于记录时,可以用它代替广度优先搜索!<br /><br
2010-10-04 18:30:00 386
原创 RQNOJ521 sudoku
<br /><br /> 这是noip2009 的第四题,也是一道让我心痛不已的题目……<br /> 拿到题目发现这显然是一到搜索,这不难看出。可能有人用dancing links 来解这道题,我认为这确实是正解,但不得不承认dancing links是一种比较高级的数据结构了,并非那么轻易就掌握的。<br /> 既然如此,单纯的但富有有技巧的搜索能不能解决这个问题呢?答案是肯定的!我今天的这个代码用到了位运算判重——这是可以过掉80%的测试数据的。如果注意搜
2010-10-04 15:50:00 335
原创 PKU1128 frame stacking
拓扑排序,没啥好说的,直接代码之! program Frame_Stacking;var data:array[0..30,0..30] of char; ans:array[0..30] of char; map:array['A'..'Z','A'..'Z'] of boolean; up,down,left,right,into:array['A'..'Z'] of longint; vis,use:array['A'..'Z'] of boo
2010-10-03 14:54:00 363
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人