- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《钓鱼》解题报告
By sx349
【摘要】
核心算法思想:枚举+贪心
主要数据结构:堆
其他辅助知识:
时间复杂度:
空间复杂度:
【题目大意】
给定N个特殊的等差递减序列(当数列中的数小于0时,全部为0)。从第一个数列开始,选择Tk个数,使得其和最大,且这Tk个数所在数列的编号组成一个不下降的序列。
【算法分析】
看到此题,首先想到的是POJ1042的Gone Fishing,这两题的思路几乎如出一辙。
显然,我们先考虑最朴素的做法:枚举。
首先,枚举起点,然后逐个点枚举钓鱼时间Ti,直到时间用完。每一次枚举起点之后所需的时间复杂度不超过,因此整个算法的时间复杂度将达到,题目中虽然没有给出Tk,但是根据这一时间复杂度,我们所能解决的问题只有大概在的范围内,这显然是无法满足要求的。
接下来我们考虑动态规划。用表示在第I个池塘钓了第J分钟的鱼后,前J分钟所钓到的鱼的最大值,那么我们有
其中表示从第K个鱼塘走到第I个鱼塘后开始钓鱼直到第J分钟能钓到的鱼的数量,算法复杂度大约在。在计算前,还可以先用一个时间复杂度的预处理来计算掉所有的的值。
这个算法所能解决的范围比之枚举显然大了很多,在没有更好算法的时候显然可以优先考虑,而且在思考时也并没有什么困难。在预处理方面还可以小小的优化一下:其实我们只需要先用计算出所有的,即在第I个池塘钓J分钟鱼所用时间,然后再用预处理计算出任意两个池塘之间的路程,如此一来时间复杂度进一步降低为。
最后,类似于POJ1042,我们可以考虑贪心的算法。贪心的算法是基于如下的一种“瞬移”的思想:假设我们钓鱼时,总是在所有鱼塘中当前鱼最多的一个池塘钓鱼,也就是说我们可以任意移动,当然,在钓过一次鱼之后,必须让它减少一定的数量Y[I]。在我们先枚举起点与终点的基础上,就可以忽略掉移动的用时,这样我们就好像在“瞬移”一样。那么为什么可以这样瞬移钓鱼呢?因为我们在某个鱼塘钓鱼之前,这个鱼塘中的鱼数目是不变的。所以,我们什么时候在这个池塘开始钓鱼不重要,我们在上面钓了几分钟鱼才是最重要的。我们可以先根据“瞬移”思想确定一个序列,然后,将这个序列中在同一个池塘钓鱼的序列拉出来,显然,这个序列是从没有钓鱼的状态,也即池中的最大值X[I]开始,然后以Y[I]为等差减小的。显然,将每个池塘的序列按照池塘序号排好,我们总能得到一个可行的序列来钓鱼,而且这个可行的序列又必然是最大的。
这个过程中,所需要的最频繁的操作是取最大值,假设我们采用数组,每次扫一遍进行这个操作,那么复杂度大约为,略优于动态规划的算法,而且编程复杂度只是略高于枚举而已;但显然,在取最大值操作上,堆是一个不错的选择。用的时间复杂度建堆之后,每次取最大值操作都是的。这样,贪心的时间复杂度最终为,比之动态规划又减小了不少,显然能够解决的数据范围也进一步增大了。
【心得体会】
显然,这道题的形式类似于POJ1042(这道题同时也见于LRJ的黑书),这对于我们的思路有很大的帮助。但如果没有做过这道题,也许能够考虑到动态规划的算法,显然也是较优的一种。
通过这道题,我有三点体会:其一,算法的适应程度而非简单程度决定了算法的效率,尽管动态规划是一种很优的算法,但是在不一定适合它的题目(比如这一道)中并不一定就一定优于贪心这种看似很简单的算法;其二,编程复杂度和算法复杂度之间要有所取舍。如果在比赛现场,如果Tk的值并不是特别大,也许我就不采用堆了(当然,堆的编程复杂度也并不是特别高),而就是直接采用数组逐位扫描;其三,要从不一样的角度思考问题,前两种算法仅限于按照题述那样考虑按照顺序在池塘间移动,而贪心算法则是超脱了这一规则,考虑了“瞬移”思想,就使得问题从新的角度得到诠释。
【附录】
2005选拔赛第一轮
2005选拔赛第一轮 钓 鱼 angle.bas/pas/c/cpp
输入文件名:angle .in 输出文件名:angle.ou
【问题描述 】
设有n个鱼塘(1≤n≤40),编号为1,2,…n,排列成一排,同时给出三行数:
第一行的n个数, 表示开始时每个鱼塘第一分钟可钓到的鱼数;
第二行的n个数,表示每过一分钟,减少的鱼数,减到0为止;
第三行的n个数,表示从第r-1个鱼塘走到第r个鱼塘花费的时间(2≤r≤n, t1 =0);
同时给出一个截止时间 tk。
钓鱼规则: 可从任何一个鱼塘开始,钓到任何时候均可转移到下一个鱼塘(只能按鱼塘编号从小到大转移)。转移到下一个鱼塘时可以不钓再往下移,但时间需要累计。
例: n=3 tk=14
24 18 19
您可能关注的文档
最近下载
- T_CNHAW 0011-2024 干眼诊疗中心分级建设要求.pdf
- 2025年道路交通安全法律法规知识竞赛题库及答案(共770题) .pdf
- ANSYS CFD-Post使用细节说明.pdf VIP
- 小学生阅读能力测试表.pdf
- 街头女郎玛吉.pdf
- 小学生心理健康教育实施现状及改进建议教学研究课题报告.docx
- 2025年山西卫生健康职业学院单招职业倾向性测试题库及完整答案1套.docx VIP
- 新苏教版小学科学三年级下册10《声音的传播》教学设计.pdf VIP
- 八年级下册物理期中复习(压轴60题19大考点)-八年级下册物理同步知识解读与专题训练(苏科版)(解析版).docx
- 2025年人教版一年级数学下册第四单元测试卷(含答案).docx VIP
文档评论(0)