|
|
|
|
|
摘要:
嗯,今天上午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... 阅读全文
posted @ 2011-09-24 16:46
This_poet
阅读(353)
推荐(0)
编辑
摘要:
本题的朴素算法很容易想出:枚举k,然后判断这个k所需要的调转次数m,并用m更新答案。但是,在求k的掉转次数m时,只要找到一个面向后面的牛,就要将它后面的k头牛再调转一遍,这样很容易浪费大量时间。也就是说,在最坏的情况下,复杂度趋近于O(n^3)!这是不可以的,必须考虑优化。优化方法如下:在读入时做一个巧妙的处理,设map数组表示这个位置上牛的状况,map[i]=0表示这头牛的方向与前一头相同,map[i]=1表示这头牛的方向与前一头牛不同。默认第0头牛的方向为向前(也就是F)。我们要做的就是将所有的牛的方向调转至和第一头牛相同。那么,每一次对于牛i,调转从牛i开始的k头牛,是不会改变这k头牛的 阅读全文
posted @ 2011-09-21 15:24
This_poet
阅读(616)
推荐(0)
编辑
摘要:
简单的动态规划。状态转移方程:f[i]=Min{f[i-1]+1,Make(i)}其中Make为自定义函数:表示取了i这个位置上的字符之后前面至少要删掉多少个才能满足条件。代码如下:Program Lexicon;//By_ThispoetConst maxn=300;Var i,j,k,m,n :Longint; f :Array[0..maxn]of Longint; std :Array[1..maxn*2]of String[25]; word :Array[0..maxn]of Char; temp :Longint; Function Mi... 阅读全文
posted @ 2011-09-21 08:13
This_poet
阅读(360)
推荐(0)
编辑
摘要:
利用单调队列进行动态规划。状态转移方程很容易写出来的: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 阅读全文
posted @ 2011-09-21 07:23
This_poet
阅读(1085)
推荐(0)
编辑
摘要:
向总等编写的《奥赛经典·提高篇》上所给出的基本模板有误,现在把正确的模板贴上来。Program MinCostMaxFlow;//By_ThispoetVar c,f,cost :Array[0..100,0..100]of Longint; a,b,ct :Array[0..100]of Longint; ans :Longint; i,j,k,m,n,p,q :Longint; seq :Array[1..10000]of Longint; h,t :Longint; v :Array[0..100]of Boolean; Func... 阅读全文
posted @ 2011-09-20 16:29
This_poet
阅读(455)
推荐(0)
编辑
摘要:
只需要对John的付款数做一次多重背包,对shopkeeper的找零钱数做一次完全背包即可。最重要的是上界的处理。可以注意到,John的付款数最多为maxv*maxv+m,也就是24400元。同理,shopkeeper找钱最多的数目为maxv*maxv.证明如下:如果John的付款数大于了maxv*maxv+m,即付硬币的数目大于了maxv,根据鸽笼原理,至少有两个的和对maxv取模的值相等,也就是说,这部分硬币能够用更少的maxv来代替。证毕。代码:Program Fewcoins;//By_ThispoetConst maxn=120; maxm=200000;Var i,j,k,m,n. 阅读全文
posted @ 2011-09-20 07:32
This_poet
阅读(738)
推荐(0)
编辑
摘要:
比较巧妙的动态规划。用f[i][j]表示第i个月,总工作了j道题目(从1~j),所能剩余的最多钱数。状态转移方程如下:f[i][j]=Max(m-∑b[j]-∑b[k]){其中,k应当满足f[i-1][k]>=∑a[j]-∑a[k]}注意最后输出的应该是ans+1,因为第一个月实际上是没有收入的。代码:Program Psolve;//By_ThispoetConst maxn=300;Var i,j,k,m,n,p,q,ans :Longint; a,b :Array[0..maxn]of Longint; f :Array[0..maxn*2,0..... 阅读全文
posted @ 2011-09-20 07:22
This_poet
阅读(475)
推荐(0)
编辑
摘要:
经典的求分数GCD和LCM的题目。方法:分别求出每个行星对于第一颗行星的相对速度,设其为ai/bi,那么答案就是乘上的一个最小的分数使得所有ai/bi与它相乘之后都为整数。那么这个分数就是:(所有bi的LCM)--------------(所有ai的GCD)用分解质因子的方法就可以求出这个分数了。注意要用高精度。代码如下:Program Astronomy;//By_ThispoetConst maxn=10000;Type arr=array[0..maxn]of Longint;Var i,j,k,m,n,tmp :Longint; t,fz,fm :Array[0..ma... 阅读全文
posted @ 2011-09-20 07:04
This_poet
阅读(1084)
推荐(0)
编辑
摘要:
什么是01分数规划:给出n个分数ai/bi,选出m个(m<=n)使得∑(ai)/∑(bi){其中i是被选出的分数编号}达到最大值。01 分数规划的两种方法:1、二分法二分一个答案k,令ci=ai-k*bi,并将ci排序,选出最大的m个,如果∑(ci){1<=i<=m}>=0,那么提高答案k的下界,否则降低上界,直到k的精度满足要求为止。2、Dinkelbach迭代法随意构造一个答案k,令ci=ai-k*bi,并将ci排序,选出最大的m个,令q=∑(ai)/∑(bi){1<=i<=m}与k的差在精度范围内就输出,否则令k=q,直至满足精度要求。总结:两种方法各 阅读全文
posted @ 2011-09-19 15:24
This_poet
阅读(1560)
推荐(0)
编辑
摘要:
此题是学习欧拉函数必做的模板题。介绍一下欧拉函数:设n为正整数,欧拉函数φ(n)定义为不超过n且与n互质的正整数的个数。三个引理:1、对于某一素数p,则φ(p)=p-12、对于某一素数p的幂次p^a,φ(p^a)=(p-1)*p^(a-1)3、对于某一合数n可分解为两个素数之积a*b,则φ(n)=φ(a)*φ(b)证明:1、显然2、对于p^a-1个比p^a小的数,其中所有p的倍数可以表示为t*p{t=1,2,3,…,p^(a-1)-1},所以φ(p^a)=p^a-1(-p^(a-1)-1)=(p-1)*p^(a-1)3、在比a*b小的a*b-1个整数中,只有那些既与a互质、又与b互质的数才会满 阅读全文
posted @ 2011-09-19 07:51
This_poet
阅读(1690)
推荐(1)
编辑
|
|