USACO 教程
“初学者平台-USACO”的相关说明

“初学者平台-USACO”的相关说明一、如何进入USACO平台1、直接在IE浏览器中键入网址/usacogate;2、如首次使用,请直接点击“Register here for a username/password”项,注册你的用户名和密码;否则,请输入用户名和密码(username/password)进行登陆。
二、可供题目(共100题左右,注意必须按顺序完成,否则将不能继续进行)Section 1.1.1PROB: Your Ride Is HerePROB: Greedy Gift GiversSection 1.1.2PROB: Broken NecklacePROB: Prime PalindromesPROB: The Errant PhysicistSection 1.1.3PROB: Mixing MilkPROB: Barn RepairPROB: What Time Is It?Section 1.1.4PROB: Checker ChallengePROB: SuperPrime RibPROB: Number TrianglesSection 1.2.1PROB: Shaping RegionsPROB: The CastlePROB: Ordered FractionsPROB: ContactSection 1.2.2PROB: Preface NumberingPROB: Runaround NumbersPROB: Money SystemsPROB: The Tamworth TwoPROB: Milking CowsSection 1.2.3PROB: OverfencingPROB: Bessie Come HomePROB: The ClocksPROB: Fractions to DecimalsSection 1.2.4PROB: Score InflationPROB: Mother's MilkPROB: Name That NumberPROB: Humble NumbersPROB: Palindromic SquaresPROB: FactorialsPROB: StringsobitsPROB: Prime CryptarithmPROB: Sorting A Three-Valued Sequence Section 1.3.1PROB: Riding The FencesPROB: Party LampsPROB: Dual PalindromesSection 1.3.2PROB: Agri-NetPROB: Home on the RangePROB: Calf FlacPROB: A GameSection 1.3.3PROB: CamelotPROB: Friday the ThirteenthPROB: Packing RectanglesPROB: Zero SumPROB: Controlling CompaniesSection 1.3.4PROB: Closed FencesPROB: Cow ToursPROB: American HeritagePROB: TransformationsSection 1.4.1PROB: Beef McNuggetsPROB: Fence RailsPROB: Fence LoopsPROB: CryptcowgraphyPROB: Arithmetic Progressions Section 1.4.2PROB: Drainage DitchesPROB: The Perfect StallPROB: Buy Low, Buy LowerPROB: Job ProcessingPROB: Frame UpSection 1.4.3PROB: The PrimesPROB: The Longest PrefixPROB: CowcyclesPROB: Shopping OffersPROB: Street RacePROB: Spinning WheelsPROB: Feed RatiosPROB: Shuttle PuzzlePROB: Magic SquaresPROB: Pollutant Control Section 1.5.1PROB: Healthy HolsteinsPROB: Subset SumsPROB: Starry NightPROB: All Latin Squares Section 1.5.2PROB: Fencing the CowsPROB: Canada TourSection 1.5.3PROB: Snail TrailPROB: PicturePROB: Window AreaPROB: Electric FencesPROB: Wisconsin SquaresPROB: Hamming Codes Section 1.5.4PROB: Avoiding Les EntarteursPROB: Map LabellingPROB: Milk MeasuringPROB: Network of SchoolsPROB: Big BarnSection 1.5.5PROB: StampsPROB: The CirclePROB: Character RecognitionPROB: Electric FencePROB: Betsy's TourPROB: TeleCowmunicationPROB: Wires and Switches Section 1.5.6PROB: Cow ScansPROB: PolygonPROB: Musical ThemesPROB: Raucous RockersPROB: Amazing BarnPROB: Letter Game。
USACO代码解析Party Lamps(lamps)

描述在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。
这些灯都连接到四个按钮:按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。
按钮2:当按下此按钮,将改变所有奇数号的灯。
按钮3:当按下此按钮,将改变所有偶数号的灯。
按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。
例如:1,4,7...一个计数器C记录按钮被按下的次数。
当宴会开始,所有的灯都亮着,此时计数器C为0。
你将得到计数器C(0<=C<=10000)上的数值和经过若干操作后某些灯的状态。
写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。
[编辑]格式PROGRAM NAME: lampsINPUT FORMAT:(file lamps.in)不会有灯会在输入中出现两次。
第一行: N。
第二行: C最后显示的数值。
第三行: 最后亮着的灯,用一个空格分开,以-1为结束。
第四行: 最后关着的灯,用一个空格分开,以-1为结束。
OUTPUT FORMAT:(file lamps.out)每一行是所有灯可能的最后状态(没有重复)。
每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。
0表示关闭,1表示亮着。
这些行必须从小到大排列(看作是二进制数)。
如果没有可能的状态,则输出一行'IMPOSSIBLE'。
[编辑]SAMPLE INPUT101-17 -1在这个样例中,有10盏灯,只有1个按钮被按下。
最后7号灯是关着的。
[编辑]SAMPLE OUTPUT0000000000010*******0110110110在这个样例中,有三种可能的状态:所有灯都关着1,4,7,10号灯关着,2,3,5,6,8,9亮着。
1,3,5,7,9号灯关着,2, 4, 6, 8, 10亮着。
从按键个数而言,如果C大于>4,我们把它不断减小2,使它小于4(这个过程也就相当于把重复的按键去掉),最后我们再枚举每一种按键所能得到的结果,加以判断就可以了。
usaco题目集

usaco题目集usaco题目集是一系列来自美国计算机奥林匹克竞赛(USACO)的编程题目。
USACO是一项面向中学生的计算机竞赛,旨在培养学生的计算机科学和算法设计能力。
该竞赛涵盖了广泛的主题,包括数据结构、图论、动态规划和搜索等。
usaco题目集的难度分为四个级别:铜牌、银牌、金牌和白金。
每个级别的题目都有一定的难度和要求。
通过完成这些题目,学生们可以提高他们的编程技巧和解决问题的能力。
usaco题目集的题目非常有趣和有挑战性。
每个题目都描述了一个具体的问题,学生需要设计和实现一个程序来解决这个问题。
这些问题有时与现实生活中的情境相关,有时与抽象的数学和逻辑问题相关。
例如,一个题目可能要求学生计算某个数列的前n项之和,另一个题目可能要求学生确定给定图形的面积。
解决这些问题需要学生们运用他们所学的算法和数据结构知识,并且具备良好的编程技巧。
usaco题目集的特点之一是其严格的评判标准。
每个题目都有一组测试数据,用于验证学生程序的正确性和效率。
程序需要在规定的时间内给出正确的输出结果,否则将被判定为错误。
这种评判标准旨在培养学生们高效率和准确性的编程能力。
通过解决usaco题目集中的问题,学生们可以提高他们的计算机科学能力,并为将来的学习和工作做好准备。
这些问题不仅可以让学生们巩固他们所学的知识,还可以培养他们的创造力和解决问题的能力。
此外,usaco题目集还提供了一个平台,让学生们可以与全美范围内的同龄人交流和竞争。
每年,usaco组织全美性的比赛,邀请来自各州的优秀选手进行角逐。
这些比赛不仅考察学生的编程能力,还促进了学生们之间的交流和合作。
总之,usaco题目集是一个很好的学习和提高编程能力的资源。
通过解决这些问题,学生们可以提高他们的计算机科学和算法设计能力,并为将来的学习和工作做好准备。
这些问题的多样性和挑战性,使得usaco题目集成为中学生们学习编程的重要工具。
usaco竞赛流程

USACO竞赛的流程大致如下:
1.在竞赛开放期间,选手需要进入竞赛页面参与比赛。
点击“Start the Contest!”键即
可开始比赛。
选手的比赛用时就会立即倒计时,且无法暂停。
2.进入题目页面后,选手可以点击标题查看相应题目并提交程序。
对于尚未提交的试题,
封面页会对应显示“Not submitted”。
对于已经提交的试题,封面页会对应显示“Submitted and Graded”。
3.选手需要按要求在自己的编程环境中完成题目,并提交cpp文件。
比赛会在时限过后自
动结束(如已经获得满分,则可以手动提前结束),只需在比赛结束前确保提交过已经完成的题目即可。
4.代码提交后,系统会自动给出评分,如果拿到了满分,系统会提示直接晋级。
如果没有
拿到满分,需要等待官方公布晋级分数线,每场月赛结束后一周内,官方会通过电子邮箱发放参赛选手的程序的评测结果。
成功晋级就可以在下一场月赛中参加更高级别的竞赛,没有成功晋级只能在下一场月赛中继续在原组别中打比赛。
USACO总结

我的USACO总结Congratulations!You have finished all available material.Chapter1DONE2008.12.16Getting startedChapter2DONE2008.12.24Bigger ChallengesChapter3DONE2009.01.15Techniques more subtleChapter4DONE2009.02.03Advanced algorithms and difficult drillsChapter5DONE2009.02.17Serious challengesChapter6DONE2009.02.20Contest Practice花了差不多四个月把USACO做完了,感觉收获很大,它就像一个私人教练能督促你学习一样,对于一个oier来说,USACO绝对是一个不可不做的经典OJ,为了整理一下知识点也当是一次巩固,便写下了这篇总结,以总结一下自己的疏漏,也希望能帮助到别人。
--湖南南县一中czz一、枚举枚举是我们用的比较多的一种算法,编程简单是它的优点,而时间效率低则是它的致命缺点,不过很多题目通过合理的优化比如减小枚举量等来优化算法。
The Clocks是第一道需要优化的枚举题,首先由于这题有9个时钟,而且每个的移动次数也不清楚,似乎无从开始,不过经过研究发现对于一个时钟如果移动四次就会便相当于没有移动,因此我们只需要枚举每个钟的四种状态共9^4共6561种状态,这样就不会超时了,不过如果进一步研究这个题目发现移动方案之间是有约束的,打个比方,A时钟由三种移动方案确定,如果其中的两种方案的次数已经知道,那么第三种方案也就会确定,因此我们只要枚举前三个方案的次数其他的便可以递推出来,状态只有4^3个,效率无疑大大提高。
Arithmetic Progressions这题由于题目要求按b升序排列,所以我们习惯性得把b放在外循环而a放在内循环,这样做加上剪枝后也会超时,由于剪枝时按a 剪枝时力度无疑会更大,因此我们可以把a提到外循环,相应的加一个快排,因此我们得出一个结论:把剪枝有利的尽量放在外循环。
usaco竞赛铜升银知识点

usaco竞赛铜升银知识点USACO(美国计算机奥林匹克竞赛)是一个面向中学生的计算机科学和编程竞赛。
它分为四个级别:铜(Bronze)、银(Silver)、金(Gold)和白金(Platinum)。
在本文中,我们将重点讨论USACO竞赛中从铜级别升级到银级别需要掌握的知识点。
1. 基本数据结构:理解和掌握基本的数据结构,如数组、链表、栈和队列。
深入学习和实践这些数据结构,以便灵活运用和解决USACO竞赛中的问题。
2. 排序与搜索算法:熟悉常见的排序算法,如冒泡排序、插入排序和快速排序。
搜索算法是USACO竞赛中最常用的算法之一,包括深度优先搜索(DFS)和广度优先搜索(BFS)等。
了解这些算法的思想和实现方式,以及它们在解决问题时的应用。
3. 动态规划:动态规划是一种重要的算法设计技巧,经常用于解决USACO竞赛中的问题。
熟悉动态规划的基本概念和解题方法,包括状态定义、状态转移方程和记忆化搜索等。
4. 图论:理解和掌握图论的基本概念和算法,如最短路径算法(如Dijkstra算法和Floyd-Warshall算法)和最小生成树算法(如Prim算法和Kruskal算法)。
熟悉图的表示方法和常见的图遍历算法,如深度优先搜索和广度优先搜索。
5. 贪心算法:贪心算法是一种基于局部最优选择来构建整体最优解的算法。
了解贪心算法的思想和特点,以及它们在USACO竞赛中的应用。
6. 算法复杂度和优化:了解算法复杂度的概念和计算方法,包括时间复杂度和空间复杂度。
学习如何分析和优化算法的效率,以在有限的时间内解决复杂问题。
7. 数学知识:USACO竞赛中的问题通常涉及数学知识。
熟悉基本的数学概念和定理,如质数、质因数分解、排列组合和概率等。
学习如何将数学知识应用于竞赛问题的求解过程中。
这些知识点只是USACO竞赛中的一部分,但它们是铜升银的基础。
通过深入学习和实践这些知识点,你将增强解题能力和编程技巧,为进一步参与USACO竞赛打下坚实的基础。
美国UC3-CT-A平衡器用户手册说明书

R e t a i l S c a l e sA logical merger of PC and scaleThe UC3-CT-A is a high-performance scale of the latest generation of UCs, focusing on users and customers. touchscreen, which is freely customisable in all respects, incorporates these aspects Our flat series saves space and provides UC3-CT-ATechnical dataUC3-CT-ACapability CharacteristicsOnline help: Operative assistance via text displays Competence text for the operatorReceipt reversal via the receipt number Extensive taring options Proof of origin (optional)Promotions (optional)Receipt enhancement (optional)Cash register modules (optional)• Cash register functions • Coin count**DisplayMonochrome STN display, VGA resolution 320 x 240 pixels Colour STN display, VGA resolution 320 x 240 pixels (optional)The display is made for the operator via a 10.4-inch colour touch-screen (resolution 800 x 600)Weight display with 5 characters 5-character tare displayFlat rate display with 8 charactersTotal amount display with 9 characters3-line text display, 20 characters per line (customer page)Coloured texts advertising on the customer displayOperation typesOperation, labelling, bulk, operation with receipt and total label, receipt and article label, stick-on total receipts, receipt with/without counterfoil Classic – by inputting the PLU number, via presets or via alphanumeric search functions, hits can be posted immediately Freely definable user layoutsPrinterChoose from a 2“ or 3“ label printer and 2“ receipt printer (standard)Possible as a 2“ linerless printer Fast label printer, up to 125 mm/s Logo printing onto receipt or labelFreely definable labels (for free designing of the labels on the PC, we offer our WYSIWYG program UC3 Label)Data MemoryMin. 40 GB hard disk256 MB RAM, 512 MB optionalSecurityPassword protection for important functions Local core database** only in combination with cash register functions/retailMore InformationQuality management certificate ISO 9001Environmental management certificate ISO 14001Internet: Worldwide ServiceSubject to technical changes ©082007 Mettler-Toledo GmbH Printed in Germany 22014468MCG MarCom GreifenseeMultimedia web support Flash Player (optional)InterfacesEthernet TCP/IP 10/1001 x RS232 serial interface1 x RJ11 interface for triggering of a cash register drawer2 x USB 2.0 connections Optional:Wireless solution according to IEEE 802.11b/g Remote service/control and data supply FTP VNCData communication via Trans UC3Data supply and disposal via XML interfaceOperating SystemMicrosoft Windows Embedded for Point Of Service (WEPOS)Linux (optional)Weighing area 6kg 15kg 3kg/6kg6kg/15kg 12kg 30kg Division 2g 5g 1g/2g 2g/5g 2g 5g Min. load* 40g 100g20g40g40g100g* EC: Printing is possible for the minimum load, however not when labelling. Taring comparison throughout the entire weighing area; automatic zeroposition.• Outstanding ergonomics – thanks to adjustment options for the customer display and touchscreen• Alphanumeric searching – just a few letters to the target of generating additional sales• Cross-selling at a high level universal networking capability; via wifi (WLAN) optionally available。
海克斯康

2测头校正方法及步骤
测头系统共分为三大部分: 测头系统共分为三大部分
1、测座(probe):PH9, PH10MQ ,MH20i 、测座( : 2、传感器(PROBE):TP2 .TP20 .TP200. SP600M等 、传感器( 等 3、测杆(TIP):TIP1BY20MM(红宝石球径 、测杆( 红宝石球径1MM,连接杆长 : 红宝石球径 连接杆长 20MM),TIP2BY20MM(红宝石球径 红宝石球径2MM,连接杆长 连接杆长20MM)等根据工件的实际测量需要,在 等根据工件的实际测量需要, 红宝石球径 连接杆长 等根据工件的实际测量需要 测座与传感器之间会有加长杆EXTENT(PEL系列)。转接 系列)。转接CONVERT 测座与传感器之间会有加长杆 ( 系列)。转接 在传感器与测杆之间还可以连接转接( (PAA1.PAA2等),在传感器与测杆之间还可以连接转接(SA2。SA3等)。加长杆 等),在传感器与测杆之间还可以连接转接 。 等)。加长杆 (SE4.SE5.GF40等) 等 现已测座(PROBE)PH10MQ.转接(CONVERT)PAA1.传感器(PROBE)TP200.测杆 现已测座( 转接( 传感器( 测杆 测座 转接 传感器 为例, (TIP) TIP2BY20MM(∮2*20mm)为例,配置测头文件。根据测量机 轴以下的实际位 ∮ 为例 配置测头文件。根据测量机Z轴以下的实际位 从测座开始由下拉菜单中选择。此时,在右边的窗口会有相应的图形出现, 置,从测座开始由下拉菜单中选择。此时,在右边的窗口会有相应的图形出现,你可以在 此进行查证,对比。直到整个系统配置完毕。 此进行查证,对比。直到整个系统配置完毕。
零件坐标系的建立: 1、3-2-1法建立坐标系: 不在同一直线上的三个点能确定一个平面, “3”——不在同一直线上的三个点能确定一个平面,利用此平面的法线矢量确定 不在同一直线上的三个点能确定一个平面 一个坐标轴方向——找正; 找正; 一个坐标轴方向 找正
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USACO教程目录Section 1.2 Complete Search枚举搜索 (2)Section 1.3 Greedy Algorithm贪心算法 (4)Section 1.3 Winning Solutions竞赛中的策略 (6)Section 1.4 More Search Techniques更多的搜索方式 (9)Section 1.5 Binary Numbers二进制算法 (13)Section 2.1 Graph Theory图论知识 (15)Section 2.1 Flood Fill种子染色法 (22)Section 2.2 Data Structures数据结构 (26)Section 2.2 Dynamic Programming动态规划 (33)Section 2.4 Shortest Paths最短路径 (40)Section 3.1 Minimal Spanning Trees最小生成树(MST) (45)Section 3.2 Knapsack Problems背包问题 (47)Section 3.3 Eulerian Tour欧拉通路 (50)Section 3.4 Computational Geometry计算几何 (59)Section 4.1 Optimization最优化 (64)Section 4.2 Network Flow网络流 (67)Section 4.3 Big Number高精度 (72)Section 5.1 Two Dimensional Convex Hull二维凸包 (77)Section 5.3 Heuristic Search启发式搜索 (84)Section 1.2 Complete Search枚举搜索思想:写枚举搜索时应遵循KISS原则(Keep it simple stupid,译为“写最单纯愚蠢的程序”,意思是应把程序写得尽量简洁),竞赛时写程序的最终目标就是在限制时间内求出解,而不需太在意否还有更快的算法。
枚举搜索具有强大的力量,他用直接面向答案并尝试所有方案的方法发现答案。
这种算法几乎总是解题时你第一个想到的方法。
如果它能在规定的时间与空间限制内找出解,那么它常常很容易编写与调试。
这就意味着你可以有时间去解答其他难题,即那些不能显示枚举算法强大的题目。
如果你面对一道可能状态小于两百万的题目,那么你可以考虑使用枚举搜索。
尝试所有的状态,看看它们是否可行。
小心!小心!有时,题目不会直接要求你使用枚举算法。
例题1:派对灯[IOI 98]在一次IOI派对上有N个灯和4个灯开光,第一个开关可以使所有灯改变状态(关上开着的灯,开启关着的灯),第二个开关可以改变所有偶数位上灯的状态,第三个开关可以改变所有奇数位上灯的状态,第四个开关控制着灯1、4、7、10……(3n+1)。
告诉你N的值和所有按开关的次数(小于10,000次)。
并告诉你某些灯的状态(例如:7号灯是关着的,10号灯是开着的)请编程输出所有灯可能的最后状态。
很明显,每次按开关你都要偿试4种可能。
那么总共要试410000 次(大约106020),那意味着你没有足够的时间去使用枚举搜索,但是我们将枚举方法改进一下,那就可以使用枚举了。
因为无论有多少个灯,由于开关控制的特殊性,都会出现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。
很遗憾,每一次调整你都只能从九种调整方案中选择一种执行(九种方案已被从1到9编号),每一种方案可以改变固定钟的状态(例如:方案1控制钟1,2,3,方案2控制钟1,4,7,方案3控制钟5,6,8,9……),即将方案指定的所有钟向前拨快3小时(使时针向顺时针方向旋转90度),请你输出一个数列,使得按该数列表示方案执行后,所有钟都指向12:00。
并且如果把整个序列看作一个数,要求该数最小。
最容易想到的方法是用递归枚举1到9的方案在该步使用。
很可怕,由于递归的层数在此没有限定,所以将用掉9k 的时间(k为层数),那可能是相当巨大的。
其实,不用紧张,细心的你一定会发现:当一个方案执行4次后,就相当于没有执行,又因为题目要求输出最优解,那么任意一个方案都没有必要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。
而一对完全对数就是指两个数都可以由对方的约数相加得出。
同样一个完全数组就是一个数组的第一个数可以由第二个数的约数加和得到,第二个数也可以由第三个数的约数相加得到……最后一个数可以由第一个数的约数加和得到。
现在Farmer John已经将它的牛儿们编好了号(1到32000)请找出其中所有的完全数牛与完全数牛群。
Section 1.3 Greedy Algorithm贪心算法样例:牛棚修理[1999 USACO 春季公开赛]Farmer John 有一列牛棚,在一次暴风中,牛棚的一整面墙都被吹倒了,但还好不是每一间牛棚都有牛。
Farmer John 决定卖木料来修理牛棚,然而,刻薄的木材提供商却只能提供有限块的木料(木料的长度不限),现在告诉你关着牛的牛棚号,和提供的木材个数N,你的任务是编程求出最小的木块长度和。
(1 <= N <= 50)贪心思想:贪心思想的本质是每次都形成局部最优解,换一种方法说,就是每次都处理出一个最好的方案。
例如:在样例中,若已经发现N = 5 时的最优解,那么我们可以直接利用N = 5 的最优解构成N = 4 的最优解,而不用去考虑那些N = 4 时的其他非最优解。
贪心算法的最大特点就是快。
通常,二次方级的存储要浪费额外的空间,而且很不幸,那些空间经常得不出正解。
但是,当使用贪心算法时,这些空间可以帮助算法更容易实现且更快执行。
贪心的难点:贪心算法有两大难点:①如何贪心:怎样才能从众多可行解中找到最优解呢?其实,大部分都是有规律的。
在样例中,贪心就有很明显的规律。
但你得到了N = 5 时的最优解后,你只需要在已用上的5块木板中寻找最靠近的两块,然后贴上中间的几个牛棚,使两块木板变成一块。
这样生成的N = 4 的解必定最优。
因为这样木板的浪费最少。
同样,其他的贪心题也会有这样的性质。
正因为贪心有如此性质,它才能比其他算法要快。
②贪心的正确性:要证明贪心性质的正确性,才是贪心算法的真正挑战,因为并不是每次局部最优解都会与整体最优解之间有联系,往往靠贪心生成的解不是最优解。
这样,贪心性质的证明就成了贪心算法正确的关键。
一个你想出的贪心性质也许是错的,即使它在大部分数据中都是可行的,你必须考虑到所有可能出现的特殊情况,并证明你的贪心性质在这些特殊情况中仍然正确。
这样经过千锤百炼的性质才能构成一个正确的贪心。
在样例中,我们的贪心性质是正确的。
如下:假设我们的答案盖住了较大的空牛棚连续列,而不是较小的。
那么我们把那部分盖空牛棚的木板锯下来,用来把较小的空牛棚连续列盖住,还会有剩余。
那么锯掉它们!还给木材商!同时我们的解也变小了。
也就是说,我们获得更优的解。
所以,靠盖住较大空牛棚连续列的方法无法获得最优解,我们也应该尽量贪心那些距离小的木板合并。
如果仍有一个空牛棚连续列与我们的答案盖住的那个相同,我们同样使用上述的方法。
会发现获得的新解与原解相同,那么不论我们选哪个,结果都将一样。
由此可见,如果我们合并的两块木板间距离最短,那么总能获得最优解。
所以,在解题的每一步中,我们都只需要寻找两块距离最小的木板并合并它们。
这样,我们获得的解必定最优。
结论:如果有贪心性质存在,那么一定要采用!因为它容易编写,容易调试,速度极快,并且节约空间。
几乎可以说,它是所有算法中最好的。
但是应该注意,别陷入证明不正确贪心性质的泥塘中无法自拔,因为贪心算法的适用范围并不大,而且有一部分极难证明,若是没有把握,最好还是不要冒险,因为还有其他算法会比它要保险。
类似问题:三值排序问题[IOI 1996]有一个由N个数值均为1、2或3的数构成的序列(N<= 1000),其值无序,现要求你用最少的交换次数将序列按升序顺序排列。
算法:排序后的序列分为三个部分:排序后应存储1的部分,排序后应存储2的部分和排序后应存储3的部分,贪心排序法应交换尽量多的交换后位置正确的(2,1)、(3,1)和(3,2)数对。
当这些数对交换完毕后,再交换进行两次交换后位置正确的(1,2,3)三个数。
分析:很明显,每一次交换都可以改变两个数的位置,若经过一次交换以后,两个数的位置都由错误变为了正确,那么它必定最优。
同时我们还可发现,经过两次交换后,我们可以随意改变3个数的位置。
那么如果存在三个数恰好为1,2和3,且位置都是错误的,那么进行两次交换使它们位置正确也必定最优。
有由于该题具有最优子结构性质,我们的贪心算法成立。
货币系统-- 一个反例[已删节]奶牛王国刚刚独立,王国中的奶牛们要求设立一个货币系统,使得这个货币系统最好。
现在告诉你一个货币系统所包含的货币面额种类(假设全为硬币)以及所需要找的钱的大小,请给出用该货币系统找出该钱数,并且要求硬币数尽量少。
算法:每次都选择面额不超过剩余钱数但却最大的一枚硬币。
例如:有货币系统为{1,2,5,10},要求找出16,那么第一次找出10,第二次找出5,第三次找出1,恰好为最优解。
错误分析: 其实可以发现,这种算法并不是每一次都能构成最优解。
反例如:货币系统{1,5,8,10},同样找16,贪心的结果是10,5,1三枚,但用两枚8的硬币才是最优解。
因为这样,贪心的性质不成立,如此解题也是错的。
拓扑排序给你一些物品的集合,然后给你一些这些物品的摆放顺序的约束,如"物品A应摆放在物品B前",请给出一个这些物品的摆放方案,使得所有约束都可以得到满足。