摘要: 个人感觉这个题不错,是传说中的DP+MST。 用f[i]表示到第i天的最小价值,那么就有转移 从第j天改变方案持续到第i天,那么就是f[j-1]+cos*(j-i+1)*v+k。 其中的cos用kruscal求得。你用prim会挂啊有木有! 还有一个应该注意的是如何处理这个哪条道路有灾害。 一开始是想每条边开一个st,ed。结果发现是不行的因为每条道路受灾的时间不一定是连续的。比如 1 2 3 4 1 2 7 8 这种数据。那么只能开一个布尔数组h[i,t]用来表示i这条边在t时间有木有灾难,就可以了。 View Code type zj=rec... 阅读全文
posted @ 2011-11-05 08:39 ZJerly 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 这个打砖头是很经典的题目。 一开始想着在题目给的形状上dp,结果发现这样的话会有三角形重合现象也就是动规有了后效性。 消除后效性要么转换状态,要么在状态里记录一下取数的情况。记录取数的情况,状压dp?别开玩笑了我直接搞不了。 那么只能转换一下,上网上看了别人的方法,把三角形倒过来了! 比如说样例: 2 2 3 4 8 2 7 2 3 49 倒过来之后——> 4 3 7 2 2 3 2 8 2 49 那么每一点只能由左边的点转移过来,和左上角一直到上一行末尾的数转移过来。 如第四行第2个数可以从第三行的1,2,3个数转移过来。为什... 阅读全文
posted @ 2011-11-02 08:48 ZJerly 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 这个题题意是说,海上有n多岛,在海岸线上(x轴)建一个雷达能覆盖到与它距离不超过d的岛,求覆盖所有岛的最小雷达数。 当然一上来就有个思路是: 先按x排序再按y排序,每次对于一个岛,找到它最右边允许的造雷达位置,建在那,把所有的这个雷达能覆盖的岛略过。 很显然这是不对的,但是“找到它最右边的位置”却是我们后面用到的思想。 注意到能覆盖每一个岛的范围是一定的。即坐标为x,y的岛只能由[x-sqrt(d*d-y*y),x+sqrt(d*d-y*y)]的雷达覆盖。 所以这个题转化成了,对于所有的区间,求最小的点数能使每个区间都至少有一个点(或许对于这个题是刚好有一个点,但是也没什么不... 阅读全文
posted @ 2011-10-31 10:32 ZJerly 阅读(922) 评论(0) 推荐(0) 编辑
摘要: 这个题自从a了上面那道题之后就变得蛮水的。但是它的合并着实让我郁闷了一番。 考虑维护这样一个并查集: fa纪录它的父亲节点,up纪录它到根节点的距离。 那么根据每个节点mod 3的值,就可知道是那种动物。(换句话说,mod 3相同的动物,是一种动物……) 那么对于询问1 如果在同一个集合里,就计算它们的up mod 3 的值,如果相同就是真话。 如果不在同一个集合里,那这就默认是真话,把它俩合并。要跟据up的值算出根节点的关系,然后更新根节点的up值。 对于询问2, 如果在同一个集合里,计算mod 3 值,如果一个等于另一个加一,或者一个是2另一个是0(环的... 阅读全文
posted @ 2011-10-28 08:36 ZJerly 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 这个题做了N长时间…… 因为一开始是不会并查集的时候纪录其他东西的,然后就想自己搞一下。 一开始是只会非递归的并查集,所以开了三个数组…… a就是纪录父亲节点的,d是纪录这一堆最下面的节点的,s是记录这个点下面有多少点的。 因为是非递归,所以每次合并之后,必须从堆在上面的那一坨最下面的节点(是用d纪录的)开始再往上更新s数组,所以它是有些慢,必须要保持树的结构的,不能路径压缩的,但是是对滴~ 所以对于这个题的11个测试点,它只能过10个……但还是贴一下记录下艰辛的历程……View Code var d,a:array[0..30000] of longint; s... 阅读全文
posted @ 2011-10-26 20:43 ZJerly 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 表示这个题想的很dt。 一开始就想f[i,a,b,c]表示第i个请求,三个人在a,b,c的最小代价。但是肯定是杀伤力超大任何评测机都闻风丧胆的TLE+MLE程序…… 后来就想能不能把i压缩掉,结果想了很长时间无果,发现如果第i时间那么它上一次一定有一个点是i-1要求的位置,还是不能搞,因为不知道怎嘛把i去掉…… 后来无语看了题解,发现是把a,b,c中压缩了一维,因为对于确定的i,至少有一个人的位置是确定的。 所以用f[i,a,b]表示,在第i个请求中,三个人分别在a,b,p[i]的最小代价。p[i]就是请求位置。 最好用主动更新,f[i-1,a,b]去更新。 如果是从p[i... 阅读全文
posted @ 2011-10-20 11:36 ZJerly 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 很久以前看过的一道dp。今天决定要A掉它。 所以开始思考,每个点有三种情况:跑步、休息或者神马也不干就那么待着。 用f[i,j]表示在第i分钟,疲劳值为j的跑出的最远距离。那么对于j>0只能由f[i-1,j-1]转移过来,因为它要跑就一直跑…… 对于f[i,0],可以等于f[i-1,0],这是神马也不干的,也可以从以前的时间休息到这,f[i,0]:=max(f[i,0],f[i-k,k]),其中0<k<=m。 然后第一重枚举时间,第二重分情况转移就行了。 对于初始化,所有点为-1,为不可达状态,f[0,0]:=0。 View Code var f:array[0..200.. 阅读全文
posted @ 2011-10-19 21:13 ZJerly 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 这道题目是求sigma(ai*(xi)^3)=0 (1=<i<=5) 的方案数。其中a1~a5是已知的。 先想最暴力的五重循环,枚举x1~x5,显然会超时,我们就想先计算出前一半,把后一半移项,如果前一半的和和后一半的数互为相反数,则方案数加一。 用一个哈希维护一下这题复杂度就能降到O(100^3)。View Code const base=3213157;var ans:longint; a:array[-4000000..4000000] of longint; b:array[-4000000..4000000] of longint; ... 阅读全文
posted @ 2011-10-17 19:36 ZJerly 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 表示不提供翻译服务,看起来就费了九牛二虎之力……再加上POJ猥琐的多组数据,再加上EOF出错,再加上数据范围出错,于是我很无语的直接上题解。 因为一个牛只能住一个棚,一个棚只能装一个牛,所以牛和棚就构成了二分图的两个集合。一个牛可以住进不同的棚,一个棚可以装不同的牛,其实我们连上边就好……让最多的牛住进最多的棚,最多棚装最多的牛,于是我们就求其最大匹配……(感觉十分啰嗦)。注意连好牛和棚之间的边……程序:View Code var map:array[1..500,1..500] of longint; {邻接表} v:array[1..500] of... 阅读全文
posted @ 2011-10-14 17:04 ZJerly 阅读(267) 评论(0) 推荐(1) 编辑
摘要: 这个题我是用树形动规做的~ f[i,0]表示i节点被儿子所覆盖的最小点数。 f[i,1]表示i节点被自己所覆盖的最小点数。 f[i,2]表示i节点被父亲所覆盖的最小点数。 然后用递归求解,说下转移方程。 设j取遍i的所有儿子 f[i,0]:=f[j,1]+sigma(min(f[k,0],f[k,1])) k是不同于j的其他儿子 f[i,1]:=1+sigma(min(f[j,0],f[j,1],f[j,2])) f[i,2]:=sigma(f[j,0]) 初始化:(即叶子节点x) f[x,0]:=maxx; f[x,1]:=1; f[x,2]:=0; ... 阅读全文
posted @ 2011-10-14 10:02 ZJerly 阅读(240) 评论(0) 推荐(0) 编辑