ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:72.48KB ,
资源ID:10983378      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10983378.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(usaco教程.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

usaco教程.docx

1、usaco教程USACO教程Complete Search 枚举搜索 思想:写枚举搜索时应遵循KISS原则(Keep it simple stupid,译为“写最单纯愚蠢的程序”,意思是应把程序写得尽量简洁),竞赛时写程序的最终目标就是在限制时间内求出解,而不需太在意否还有更快的算法。 枚举搜索具有强大的力量,他用直接面向答案并尝试所有方案的方法发现答案。这种算法几乎总是解题时你第一个想到的方法。如果它能在规定的时间与空间限制内找出解,那么它常常很容易编写与调试。这就意味着你可以有时间去解答其他难题,即那些不能显示枚举算法强大的题目。如果你面对一道可能状态小于两百万的题目,那么你可以考虑使用枚

2、举搜索。尝试所有的状态,看看它们是否可行。 小心!小心! 有时,题目不会直接要求你使用枚举算法。 例题1:派对灯 IOI 98 在一次IOI派对上有N个灯和4个灯开光,第一个开关可以使所有灯改变状态(关上开着的灯,开启关着的灯),第二个开关可以改变所有偶数位上灯的状态,第三个开关可以改变所有奇数位上灯的状态,第四个开关控制着灯1、4、7、10(3n+1)。 告诉你N的值和所有按开关的次数(小于10,000次)。并告诉你某些灯的状态(例如:7号灯是关着的,10号灯是开着的)请编程输出所有灯可能的最后状态。 很明显,每次按开关你都要偿试4种可能。那么总共要试 410000 次(大约 106020)

3、,那意味着你没有足够的时间去使用枚举搜索,但是我们将枚举方法改进一下,那就可以使用枚举了。因为无论有多少个灯,由于开关控制的特殊性,都会出现6个灯一次循环的情况,即1号灯的状态永远与7号灯,13号灯,19号灯相同,2号灯的状态也永远与8号灯,14号灯,20号灯相同。同样,无论你按了多少次开关,按同一个开关两次就相当于没有按该开关,那么每一个开关就只需要考虑按一次或没有按,那么这题的枚举量就很小了。 例题2: 时钟调整 IOI 94 有九个钟被摆放在一个3 X 3的矩阵中,它们各自指向12:00,9:00,6:00,3:00中的一种,你的目的是将它们的指针全部调向12:00。很遗憾,每一次调整你

4、都只能从九种调整方案中选择一种执行(九种方案已被从1到9编号),每一种方案可以改变固定钟的状态(例如:方案1控制钟1,2,3,方案2控制钟1,4,7,方案3控制钟5,6,8,9),即将方案指定的所有钟向前拨快3小时(使时针向顺时针方向旋转90度),请你输出一个数列,使得按该数列表示方案执行后,所有钟都指向12:00。并且如果把整个序列看作一个数,要求该数最小。 最容易想到的方法是用递归枚举1到9的方案在该步使用。很可怕,由于递归的层数在此没有限定,所以将用掉 9k 的时间(k为层数),那可能是相当巨大的。其实,不用紧张,细心的你一定会发现:当一个方案执行4次后,就相当于没有执行,又因为题目要求

5、输出最优解,那么任意一个方案都没有必要4次以上执行。也就是说,只需要枚举每一个方案的4种情况(没执行,执行1,2,3次)就可以了。他仅有49 ,约262,072此枚举,我们的计算机1s内就可以算完,应该算是极快了。 类似问题: 挤牛奶 USACO 1996 初赛 给出一个挤牛奶的顺序(农夫 A 在 300 秒到 1000秒时挤牛奶, 农夫 B从 700 秒到 1200秒),要求输出: 最长的有人挤牛奶的时间。 最长的没人挤牛奶的时间。 完全数牛与完全数牛群 USACO 1995 决赛 如果一个数可以由它的某几个约数相加得到,那么我们叫它完全数,如28 = 1 + 2 + 4 + 7 + 14。

6、而一对完全对数就是指两个数都可以由对方的约数相加得出。同样一个完全数组就是一个数组的第一个数可以由第二个数的约数加和得到,第二个数也可以由第三个数的约数相加得到最后一个数可以由第一个数的约数加和得到。 现在Farmer John已经将它的牛儿们编好了号(1到32000)请找出其中所有的完全数牛与完全数牛群。贪心算法样例:牛棚修理 1999 USACO 春季公开赛Farmer John 有一列牛棚,在一次暴风中,牛棚的一整面墙都被吹倒了,但还好不是每一间牛棚都有牛。Farmer John 决定卖木料来修理牛棚,然而,刻薄的木材提供商却只能提供有限块的木料(木料的长度不限),现在告诉你关着牛的牛棚

7、号,和提供的木材个数N,你的任务是编程求出最小的木块长度和。(1 = N = 50)贪心思想:贪心思想的本质是每次都形成局部最优解,换一种方法说,就是每次都处理出一个最好的方案。例如:在样例中,若已经发现 N = 5 时的最优解,那么我们可以直接利用 N = 5 的最优解构成 N = 4 的最优解,而不用去考虑那些 N = 4 时的其他非最优解。贪心算法的最大特点就是快。通常,二次方级的存储要浪费额外的空间,而且很不幸,那些空间经常得不出正解。但是,当使用贪心算法时,这些空间可以帮助算法更容易实现且更快执行。贪心的难点:贪心算法有两大难点:如何贪心:怎样才能从众多可行解中找到最优解呢?其实,大

8、部分都是有规律的。在样例中,贪心就有很明显的规律。但你得到了 N = 5 时的最优解后,你只需要在已用上的5块木板中寻找最靠近的两块,然后贴上中间的几个牛棚,使两块木板变成一块。这样生成的 N = 4 的解必定最优。因为这样木板的浪费最少。同样,其他的贪心题也会有这样的性质。正因为贪心有如此性质,它才能比其他算法要快。贪心的正确性:要证明贪心性质的正确性,才是贪心算法的真正挑战,因为并不是每次局部最优解都会与整体最优解之间有联系,往往靠贪心生成的解不是最优解。这样,贪心性质的证明就成了贪心算法正确的关键。一个你想出的贪心性质也许是错的,即使它在大部分数据中都是可行的,你必须考虑到所有可能出现的

9、特殊情况,并证明你的贪心性质在这些特殊情况中仍然正确。这样经过千锤百炼的性质才能构成一个正确的贪心。在样例中,我们的贪心性质是正确的。如下:假设我们的答案盖住了较大的空牛棚连续列,而不是较小的。那么我们把那部分盖空牛棚的木板锯下来,用来把较小的空牛棚连续列盖住,还会有剩余。那么锯掉它们!还给木材商!同时我们的解也变小了。也就是说,我们获得更优的解。所以,靠盖住较大空牛棚连续列的方法无法获得最优解,我们也应该尽量贪心那些距离小的木板合并。如果仍有一个空牛棚连续列与我们的答案盖住的那个相同,我们同样使用上述的方法。会发现获得的新解与原解相同,那么不论我们选哪个,结果都将一样。由此可见,如果我们合并

10、的两块木板间距离最短,那么总能获得最优解。所以,在解题的每一步中,我们都只需要寻找两块距离最小的木板并合并它们。这样,我们获得的解必定最优。结论:如果有贪心性质存在,那么一定要采用!因为它容易编写,容易调试,速度极快,并且节约空间。几乎可以说,它是所有算法中最好的。但是应该注意,别陷入证明不正确贪心性质的泥塘中无法自拔,因为贪心算法的适用范围并不大,而且有一部分极难证明,若是没有把握,最好还是不要冒险,因为还有其他算法会比它要保险。类似问题:三值排序问题 IOI 1996有一个由N个数值均为1、2或3的数构成的序列(N 2 时(子节点的数目大于2),差距将变小:ID的时间消耗不可能大于同效BF

11、S的两倍。 所以,但数据较大时,ID-DFS并不比BFS慢,但是空间复杂度却与DFS相同,比BFS小得多。算法选择:当你已经知道某题是一道搜索题,那么选择正确的搜索方式是十分重要的。下面给你一些选择的依据。 简表: 搜索方式 时间 空间 使用情况 DFS O(c k) O(k) 必须遍历整棵树,要求出解的深度或经的过节点,或者你并不需要解的深度最小。 BFS O(c d ) O(c d ) 了解到解十分靠近根节点,或者你需要解的深度最小。 DFS+ID O(c d) O(d) 需要做BFS,但没有足够的空间,时间却很充裕。 d :解的深度 k :搜索树的深度 d = k 记住每一种搜索法的优势

12、。如果要求求出最接近根节点的解,则使用BFD或ID。而如果是其他的情况,DFS是一种很好的搜索方式。如果没有足够的时间搜出所有解。那么使用的方法应最容易搜出可行解,如果答案可能离根节点较近,那么就应该用BFS或ID,相反,如果答案离根节点较远,那么使用DFS较好。还有,请仔细小心空间的限制。如果空间不足以让你使用BFS,那么请使用迭代加深吧!类似问题:超级质数肋骨USACO 1994 决赛一个数,如果它从右到左的一位、两位直到N位(N是)所构成的数都是质数,那么它就称为超级质数。例如:233、23、2都是质数,所以233是超级质数。要求:读入一个数N(N = 9),编程输出所有有N位的超级质数

13、。这题应使用DFS,因为每一个答案都有N层(最底层),所以DFS是最好的 Betsy的旅行 USACO 1995 资格赛一个正方形的小镇被分成 NxN (2 = N =1)个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。我们如果把输出的路径看成是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一个数较小的,如果还有多组解,输出第二个数较小的,等等)。输入数据保证至少有一个解。图: 农民John从一个栅栏交叉点开始,经过所有栅栏一次。因而,图的结点就是栅栏交叉点,

14、边就是栅栏。 骑士覆盖问题在一个 n x n 的棋盘中摆放尽量少的骑士,使得棋盘的每一格都会被至少一个骑士攻击到。但骑士无法攻击到它自己站的位置. 图: 这里的图较为特殊,棋盘的每一格都是一个结点,如果骑士能从这一格跳到另一格,这就说在这两个格相对应的结点之间有一条边。 穿越栅栏 1999 USACO 春季公开赛农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个完美的迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。这是一个W=5,H=3的迷宫: +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。图: 如上图,图的每一个位置都是一个结点,如果两个相邻的位置之间没有被栅栏分开,则说在这两个位置相对应的结点之间有一条边。 用语:我们再看刚才的图:如果有一条边起点与终点都是同一个结点,我们就称它为环边, 表示为(v, v),上图中没有环边。 简单图是指一张没有环边且边在边集E中不重复出现的图。与简单图相对的是复杂图。在我们的讨论中不涉及复杂图,所有的图都是简单图

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1