ural all verson吐血大推荐_pascal vs.c解题报告.pdfVIP

ural all verson吐血大推荐_pascal vs.c解题报告.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《Pascal vs C++》解题报告 福州一中 [问题简述] 给N 个数 a[n],求这N 个数最多能够构成最长多少的等差数列,并且差值不为 0 。要 求给出一个具体的方案。 [数据规模及时空限制] 1、n=2000,Memory:16Mb,Time:0.25s 2 、n=10000,Memory:4Mb,Time:1s [算法分析] 首先排序以及去除相邻项是必不可少的。求递增的等差数列和递减的等差数列是无所谓的, 因为他们是一一对应的。 数据规模 1 很明显是想让 想出一个时间复杂度 O(N^2)或者O(N^2 log N) 的方法, 并且对空间以及常数没有什么限制。 这应该还是没什么太大的难度的。令 f[i][j]表示倒数第二项为 I,最后一项为 J 的等差数 列最长有多少项。之后用 f[k][i]+1 更新,其中a[i]-a[k]=a[j]-a[i],这里的k 可以利用 Hash 表或者二分的方法来计算求出。这样,算法的时间复杂度就为O(N^2)或者 O(N^2 log N) , 空间复杂度为 O(N^2) 。 但是这种算法对于数据规模 2 却是 为力了,且不说算法的常数比较高,空间就让人 难于承受,10^8 的 量就算是 byte 也 为力,更何况 4Mb 。Sigh~~ 之后我曾经试图找一个低于 O(N^2) 的算法,但是始终没有发现任何方法,而通过在 discuss 上的 来看,这题似乎也不存在比 O(N^2)高效的方法, 只能尽量思考一些降 低常数的方法。 首先 应该抛弃掉定势思维,摒弃掉之前想的 N^2 的方法,因为那种方法对于空间 的问题 实在是无路可走了。 让 再从原始的方法上看看:用枚举的方法。枚举第一项,枚举第二项,看这个数列 能够有多长。这种方法最原始的时间复杂度为:O(N^3) 。但是 却去除了空间上的限制, 可以放手对算法进行优化。 首先最明显的优化就是:如果对于 I j k,有a[k] –a[j] = a[j] – a[i],那么 枚举了 I,j 后就没有必要再另行枚举 j,k 了,这个优化看似普通,但是它能够让 总的枚举数量降 到O(N^2)阶的,而 却很容易给忽视掉~~ 。 当然第一个优化只是让 有可能将算法复杂度变为 O(N^2) 的,但是接下来处理数列 时如果做得不够好的话,仍然不是N^2 级别的,这时候 就需要借助Hash 这个强大的武 器了,用 Hash 表来判断是否存在a[j] + (a[j] – a[i]) 。通过Hash,算法的时间复杂度就成功地 变为了 O(N^2) 。 但是这题不仅仅要求 时间复杂度为 O(N^2) 。他要求 常数写得尽可能的低。 于是还需要几个优化:1、最优性剪枝;2 、Hash 表;3、语言种类。 1、最优性剪枝: 假设当前最优解是res,那么如果数列中不存在 a[i] + res * (a[j] – a[i]) 的话,就没 有必要枚举之了,因为它不可能更新最优解。如果 a[i] + res * (a[j] –a[i])a[n]的话, 也没有必要继续枚举 i 作为首项了,因为之后的枚举公差都a[j] – a[i],而a[i] + res * (a[j] – a[i])a[n]也保证了之后的枚举无法更新了。 2 、Hash 表: 首先要说的是:用开散列而不要用闭散列,因为闭散列的 比开散列的 只多不少,并且采用边表类型写法的开散列在常数上也不会比闭散列大;其次,在 Hash 值的设定上,建议使用位操作,并且越简便越好。一开始的时候 取模一 个质数之类的,这样 的机会会比位操作少掉很多,毕竟不会有什么人刻意的 去找你设置的质数值,然而提交之后却失望的TLE 了,原因主要在于,本题利用 Hash 的询问次数实在是太多了,如果采用太多次的模运算的

文档评论(0)

137****2076 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档