|
|
|
|
|
|
Poj1180 Batch Scheduling --- DP的斜率优化
摘要:题意N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i 个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完 成)。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。算法讨论毫无疑问DP.转移方程:dp[i]=Min{dp[j]+(sumF[i]-sumF[j])*sumT[i]+s*(sumF[N]-sumF[j])},其中dp[i]表示的是完成1~i的工作的花费+因为开机
阅读全文
POJ3070 Fibonacci ——矩阵乘法+快速幂——纪念我的第一道矩阵乘法
摘要:做法题目中已经给了,就是将{ 1,1 1,0}这个矩阵自乘n次。连续自乘n次的话就没意思了,那还不如直接上Fibonacci递推公式呢。矩阵的魅力就在于它可以上快速幂。因为矩阵乘法满足结合律么……代码:program poj3070;//By_Thispoetconst mol=10000; fib:array[1..2,1..2]of longint=((1,1),(1,0));type arr=array[1..2,1..2]of longint;var n :longint; ans :arr;function quickmi(p:longint):arr;var tmp...
阅读全文
POJ2018 Best Cow Fences——二分答案+贪心(动态规划)求最大子段和——pku2018
摘要:可以转换成二分答案求最大连续子段和来做。每次在a[i]的基础上减去二分出来的答案。求出长度不小于f的最大连续子段和。如果大于0,则调整下边界,否则调整上边界。求长度不小于f的最大连续子段和需要一些小技巧,比如说判断以i为终点的连续子段和,就可以看sum[i]-sum[i-f]+dp[i-f]的正负。其中dp[i]表以i为终点的最大连续子段和。具体见代码。Program cowfnc;//By_ThispoetConst maxn=100005;Var i,j,k,m,n,f,ans :Longint; l,r,mid :Longint; a,dp,sum,b :A...
阅读全文
POJ2528 Mayor's posters——线段树+离散化——Pku2528
摘要:嗯,挺水的题,说说注意事项吧。坐标轴线段是这样覆盖的:|-------|-------|-------|-------|-------|-------|-------|-------|1 23 4 5 6 7 8而不是这样的:|-------|-------|-------|-------|-------|-------|-------|-------|0 1 2 3 4 5 6 78我在建立线段树的过程中加上了hash判重……避免被覆盖了的线段也被统计……注意hash不要写错了要采用lazy-tag思想,否则会TLE……我的代码:Program poj2528;//By_thispoetC.
阅读全文
POJ1276 Cash Machine——背包+优化——pku1276
摘要:嗯,今天上午ywt命令我写二进制压位背包,于是今天下午犯了一下午的sx,然后终于做出来了。布尔型背包压位存储不会写,拿来练手。WA了N次,然后写不加优化的,还是WA,最后发现自己把二进制拆分边界条件写错了……看完lyd的题解,发现还有一种不用单调队列、不用压位、但是空间花销比较大的简单算法,贴个传送门吧:http://poj.org/showmessage?message_id=156751我的代码:Program Cash_Machine;//By_ThispoetVar i,j,k,m,n,p,q,v,c,a,b :Longint; f :Array[-1..4000...
阅读全文
POJ2373 Dividing the Path——动态规划+单调队列优化
摘要:利用单调队列进行动态规划。状态转移方程很容易写出来的:f[i]=Min{f[j]}+1(i-2*b<=j<=i-2*a)这样,时间复杂度最坏情况下是O(n^2)的,对于n<=1000000的数据来说,程序根本无法承受怎么办呢?单调队列很强大!维护一个单调队列,队列里存的是按符合条件的f数组内值严格单调递增的下标值。很显然,利用队首元素就可以直接转移了。队首元素要满足的条件很简单嘛,i-2*b<=seq[h]<=1-2*a中间有一些小小的技巧,比如说,计算每个f值的时候,不是计算出来就将它插入到队列里,而是在计算f[i+2*a]之前把它插入队列中。不过说了,CODE
阅读全文
POJ3251 Big Square——搜索+强力剪枝——Pku3251
摘要:O(n^4)+强力剪枝优化无压力,不用二分图匹配的麻烦构图。搜索策略:枚举对角线——因为只有枚举对角线才能保证正方形唯一。剪枝:1、对于每个是'J'的点,枚举出它非严格下方的所有'J'点,不用全部枚举N^4次2、对于每条对角线,计算出其中点tx、ty坐标与两个端点x、y坐标的差值x1,y1,x2,y2,如果tx+y1或ty+x2不是整数就判断下一个。判断条件:对于每条合法对角线,满足((map[tx+y1,ty+x2]='J')and(map[tx+y2,ty+x1]<>'B'))or((map[tx+y2,ty+x1
阅读全文
POJ3253 Fence Repair ——贪心(Huffman树的构造)+堆——Pku3253
摘要:思想与合并果子相同。逆序地来想,显然这些板子必须一共切割n-1次,如何恰当的分配这n-1次切割就是关键所在。这里就用到了构造Huffman树的贪心思想。即每次从待合并序列中取两个最小的值,将它们合并成一个较大的,然后把这个较大的在加入进待合并的序列当中,直到待合并序列中只有一个元素。而不加任何优化时复杂度为O(n^2),难以承受。可以用堆将复杂度优化到O(nlogn),就完全可以接受了。CODEProgram plank;//By_ThispoetConst maxn=20000;Var i,j,k,m,n,heap_size :Longint; ans :Int6...
阅读全文
POJ3189 Steady Cow Assignment ——二分答案+二分图多重匹配——Pku3189
摘要:改进过后的匈牙利算法即可轻松秒掉最大流的各种NB算法。不过,这种方法有一个局限,就是右边集合可以匹配多个而左边集合只能匹配一个的时候才可以用,否则只能搞神马SAP等等了。匈牙利算法的改进:1、存储右边集合的结果时不要只存一个,而是将所有匹配结果都存下来。2、在找增广路时,把(res[k]=0)的条件改成(res[k,0]<max[k])CODEProgram Stead;//By_ThispoetConst maxn=1000;Var pre,other,last :Array[1..maxn*20]of Longint; res :Array[1..20,0....
阅读全文
POJ1465 Multiple——Bfs+余数判重——Pku1465
摘要:这道题精在判重优化。因为如果存在两个数A、B,且满足A mod n=B mod n=C,那么,这两种情况可以看做是重复的,保留较小数即可。具体优化,开一个布尔数组即可。特别需要注意一点:如果n=0,那么应当输出0!!!{本弱就因为这个WA了半天,看Discuss才明白的……}CODEProgram Multiple;//By_ThispoetConst maxn=20000;Var h,t,j,k,m,n,i :Longint; seq,fa,mol :Array[1..maxn]of Integer; a :Array[1..maxn]of Longint; fg ...
阅读全文
POJ1151 Atlantis ——离散优化——Pku1151
摘要:分别将x、y坐标排序之后统计有效小矩形即可。这类题目也可以加上线段树优化,可是这道题的数据范围仅仅为n<=100,是可以不用线段树的,直接统计也能AC.CODEProgram Atlantis;//By_ThispoetConst maxn=300;Var i,j,k,m,n,p,q :Longint; ans :Extended; x,y,hx,hy :Array[1..maxn]of Extended; rankx,ranky :Array[1..maxn]of Longint; rex,rey :Array[1.....
阅读全文
|
|