noip2010普及组解题报告书(c++)由锦云收集.docVIP

noip2010普及组解题报告书(c++)由锦云收集.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
noip2010普及组解题报告书(c)由锦云收集

2010年NOIP 普及组解题报告 北京市八一中学 王祺磊 感谢: 我也学习一下,现在的流行趋势,先开始感谢,但这真的是发自内心的感觉,让我发出一下这些感谢。 一、感谢和我一起并肩战斗信息学奥赛教学一线的老师们,是你们给了我温暖,让我感受到一个温馨的集体,在其中,我们一起学习,一起研讨; 二、感谢一直和我一起战斗在一起的孩子们,是你们跟我一起,在风雨中奋斗,一起成长; 三、感谢我的几位师长,是你们一直在我成长的过程中,指引我前进的方向; 四、特别感谢,几位与我一起成长起来的“小牛”,是你们,反馈给了我很多需要学习的知识,让我逐渐成熟。 关于2010年普及组考题: 没有想到,这次的题目和2008、2009年的题目完全风格两样,我不知道是不是出题老师发生了变化。但是,总体感觉,题目趋于容易,甚至没有涉及DP、搜索中的初级方法。但是,题目很多知识点又隐含颇多。不容易拿到完美的分数。感谢出题老师,给我们带来的这届优秀题目。 题目分析: 一、数字统计 此题,曾经在某OJ上看到过原题。要求和实现都非常简单。无非是,枚举出所有在范围内的数字,然后对数字进行拆分,对每一位数字进行判断。 一个朴素的for循环,嵌套一个while循环,就可以解决这道题目。 下面是程序的核心部分: for ( i = l ; i = r ; i++ ) { t = i; while (t 0) { y = t % 10; if (y == 2) s++; t /= 10; } } 此题丢分,绝对可以认为是绝不应该出现的事情。往参赛选手能够更加注意自己的程序细节,避免问题出现。 二、接水问题 问题描述隐晦,引导学生朝着纯枚举的思想前进,部分用秒枚举的学生会导致严重超时。但题目的核心思想却应该是模拟问题发生的本质顺序。也就是,每个新加入的人去接水的位置,一定是当前数列中和最小的那列。所以实现的方法,就是每个新数字,进入前,找出当前序列中最小的位置,加入进去。直到所有的数字都加入进去后结束。最终从所有的数字中,找出最大的那个值,即为所求。 但是,其实有更合适的模型——插入法排序。 即从大到小排序后,无非就是把数字加入到最后一个数值之上,然后运用插入法排序原理,把这个新数插入到合适位置。最终输出的是数组的最大值即可。 下面是程序的核心部分: 首先,对前m个数进行排序,然后后面的n – m个数,就需要模拟插入了: for (i = m ; i n ; i++ ) { cin t; t += a[m - 1]; j = m - 1; while (j 0 a[j - 1] t) { a[j] = a[j - 1]; j--; } a[j] = t; } 最后a[0]一定是最大值。 非常想用这道题,告诉那些忽视插入法排序的学生,当你写不好快排的时候,插入法,帮我们解决了很多为了一个数值而要排全部数值的问题。虽然效率和选择、冒泡一样,但插入法确实有它特殊之处。 三、导弹拦截 再次见到导弹拦截,颇感亲切,但是这次的导弹拦截,加入了立体环节,也从借用原题概念,让一个不存在的动态规划方法,影响解题思路。 其实,题目的核心解题思想还是贪心和枚举。只不过要枚举的有些策略而已。我也曾试过了,用单位长度去枚举两个点的半径,结果残酷的只过了两个点。还是经过学生的解释,明白了排序后的贪心策略。所以,向学生学习,也是老师的必修课程。我再次强调,我经常向学生学习,教学相长,不外乎如此。所以,希望更多的老师,能够时常放下自己的架子和身份,多多向学生请教,我们共同的成长。 按照到第一个点的距离平方排序之后,就可以不断让最远的点,不用离开第一点半径,进入第二点半径。在这个过程中,第一点半径逐渐缩小,第二点半径,可能发生增大。就需要一步步统计出,两个半径平方的最小值。最终达到题目要求。 因为考虑到点的数量是100000,所以,无比需要使用快速排序。题目如果想写的较为简洁,还是使用结构体比较方便。 首先定义一个结构体,包括x,y,jr1(距离第1点半径平方),jr2(距离第2点半径平方)。 struct dian { int x; int y; int j1r; int j2r; }d[100050]; 这里面顺便定义了一个10万数量级的数组。 快速排序的函数: void qsort(int s, int e) { dian t; int l, r; if (s = e) return ; l = s; r = e;

您可能关注的文档

文档评论(0)

100101 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档