高中信息技术 NOIP2005信息学奥林匹克提高组解题报告.docVIP

高中信息技术 NOIP2005信息学奥林匹克提高组解题报告.doc

  1. 1、本文档共6页,可阅读全部内容。
  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文档。上传文档
查看更多
NOIP2005信息学奥林匹克分区联赛 解题报告 第一题:谁拿了最多的奖学-Scholar [问题评估] 这个题目据问题本身而言是相当简单的,没有牵涉到过多的算法,属于普及型试题。同时也是对实际问题一种分析和判断。总的来看,本题在方向上,向现实问题迈出了一步,是信息学和生活有了更多的联系。 问题的算法是模拟。当中唯一的难点就是数据处理,考察点为数据库的建立和统计。 [程序实现] 由于程序数据范围只有100,当中不牵涉到数据移动,所以用一个纪录型数组,或者多个数组均可,在这里我们使用纪录型来描述。 对于输入数据有两种方式来实现。 法一〉逐个字符累加。 首先定义C:char; 然后利用Until c=‘ ’;作为终止符,将读入的字符连接存储到a[i].name中。 代码为: Repeat read(c); a[i].name:=a[i].name+c; until c=’ ‘; a[i].name:=copy(a[i].name,1,length(a[i].s)-1); 这样做的好处是,后面的值可以直接用read语句读入。但是最后一个值后,要记得readln; 法二〉一次读入,然后分离。 这样做需要逐个分离,对本题来说稍显复杂,但对NOIP来说此方法必须掌握,有的时候一定要用。 具体实现,读入一个字符串S。利用pos(‘ ‘,s);找出空格位置。再利用Copy函数,和Val函数进行截取,和转换。 部分代码:(s:string;j,ok:integer) readln(s); j:=pos(‘ ‘,s); a[i].name:=copy(s,1,j-1); s:= copy(s,j+1,50); //当长度〉字符串长度是,为后面全部截取。 j:=pos(‘ ‘,s); Val(copy(s,1,j-1),a[i].qp,ok); s:= copy(s,j+1,50); ….. 对于符号用if语句作一下判断就是了,太easy不写了,后面还有几个值,用同样方法处理就可以了。 以上完成了数据库的建库工作,后面是统计,当然,我们在没读完一行数据后就可进行统计。用If语句判断他是否能得到相应的分值即可。分5条If语句写,每回可以就加入相应的分值。 将每个的分值汇总计入到总数变量ZD当中。与当前最大值进行比较,得到Max对应的I值。后面就是输出的问题了。 [小结、注意] 本题为简单题,只要思路明确清晰,就可AC。时间复杂度O(n)。但有一个细节,ZD变量必须定义Longint或以上类型否则会Error201的。 第二题 过河-River [问题分析] 此题初看是一个典型的搜索题。从河的一侧到河的另一侧,要找最少踩到的石头数。但从数据范围来看。1..109长度的桥。就算是O(n)的算法也不能在一秒内出解。 如果搜索石子,方法更困难。这要考虑到前面以及后面连续的石子。若换一种方法。用动态规划,以石子分阶段的一维动规,时间复杂度是O(n2)。最多也只有100×100的时间。但是这样分状态就十分复杂。因为石头的分布是没有任何规律,而且会有后效性。 这样只好有回到搜索。搜索石子会和动规一样没有规律。我们一桥的长度为对象进行搜索,然后再加上一个巧妙的剪枝就可以在很短的时间内出解。可以号称为O(m2)。[批注:号称一词已成为湖南OI本世纪流行词汇 ] [题目实现] 先以时间为对象进行搜索。时间复杂度为O(L)。从桥的一侧到另一侧,中间最多只有100个石子。假设桥长为最大值(109),石头数也为最大值(100)。这样中间一定会有很多“空长条” (两个石子中的空地),处理时把这些跳过,就只会有M次运算。关键是找出每一个可以跳过的“空长条”。 我们可以先把青蛙可以跳出的所有可能求出,然后就可以求出可以忽略的“空长条”。 [特殊算法] a[i]:前i个坐标中石子最小个数,初始为第i个坐标的石子个数 b[i]:第i个石子坐标 动规 a[0]=0; 对n=t a[n]=min{a[n]+a[n-s],a[n]+a[n-s-1], ...,a[n]+a[n-t]} 对s=nt a[n]=max{a[n]+a[n-s],a[n]+a[n-s-1],...,a[n]+a[0]} 但由于n较大直接动规会超时。所以要将n压缩 查看坐标,可以发现,如果b[i]-b[i-1]t,显然对于b[i-1]+tnb[i],a[n]总是等于a[b[i-1]]..a[b[i-1]+t]中的数,因此可对其进行压缩。 注意,在计算过程中,由于其中有一些坐标是永远走不到的,因此需要用一个布尔型的数组c[n]进行判断。方法是,对于c[n],如果0ns,则c[n]为false,如果ns,c[n-t],c[n-t

文档评论(0)

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

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

1亿VIP精品文档

相关文档