ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:20.37KB ,
资源ID:12668183      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12668183.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NOIP普及组复赛思路及程序PASCAL.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

NOIP普及组复赛思路及程序PASCAL.docx

1、NOIP普及组复赛思路及程序PASCALNOIP 2007 普及组解题报告 1奖学金 (scholar.pasccpp) 【问题描述】 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格

2、按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。 【输入】 输入文件scholar.in包含行n+1行: 第l行为一个正整数n,表示该校参加评选的学生人数。 第2到年n+l行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为j-1的学生的

3、语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1n(恰好是输入数据的行号减1)。 所给的数据都是正确的,不必检验。 【输出】 输出文件scholar.out共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。 【输入输出样例l】 scholar.in scholar.out 6 90 67 80 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98 6 265 4 264 3 258 2 244 1 237 【输入输出样例2】 scholar.in scholar.out 8 80 89 89 88 98 78 90 67 80

4、 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98 8 265 2 264 6 264 1 258 5 258 【限制】 50的数据满足:各学生的总成绩各不相同 100的数据满足:6=n=300 【试题分析】 简单的排序。因为n=300,所以选择排序不会超时。 存储方面只需存储三个数:学好、语文成绩和总分。 【参考程序】 program a1(input,output); var n,x,y,z,i,j:integer; a:array1.300,1.3 of integer; procedure swap(var a,b:integer); 交换过程

5、var s:integer; begin s:=a; a:=b; b:=s; end; begin assign(input,scholar.in); assign(output,scholar.out); reset(input); rewrite(output); readln(n); for i:=1 to n do begin readln(x,y,z); ai,1:=i; ai,2:=x; ai,3:=x+y+z; end; for i:=1 to n-1 do 选择排序 for j:=i+1 to n do if (ai,3aj,3) or (ai,3=aj,3) and (ai,

6、2aj,1) and (ai,3=aj,3) and (ai,2=aj,2) then begin swap(ai,1,aj,1); swap(ai,2,aj,2); swap(ai,3,aj,3); end; for i:=1 to 5 do writeln(ai,1, ,ai,3); close(input); 文件不要忘记关闭 close(output); end. 2纪念品分组 (group.pasccpp) 【题目描述】 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪

7、念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。 【输入】 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上限。 第2行为一个整数n,表示购来的纪念品的总件数。 第3n+2行每行包含一个正整数pi(5=pi=w),表示所对应纪念品的价格。 【输出】 输出文件group.out仅一行,包含一个整数,即最少的分组数目。 【输入输出样例】 group.in group.out 100 9 90 20 20 30 5

8、0 60 70 80 90 6 【限制】 50的数据满足:l=n=15 100的数据满足:1=n=30000,80=w=200 【试题分析】 贪心法,先排序,然后按以下贪心策略: 设s为所需的组数。i,j为两个指针,开始时指向头和尾。 1 如果ai+ajw,s:=s+1,j:=j-1。 因为np) and (ji) do j:=j-1; if ji then begin ai:=aj; i:=i+1; while (aip) and (ij) do i:=i+1; if ij then begin aj:=ai; j:=j-1; end; end; until i=j; ai:=p; i:=i

9、+1; j:=j-1; if ih then qsort(h,j); end; begin assign(input,group.in); assign(output,group.out); reset(input); rewrite(output); readln(w); readln(n); for i:=1 to n do readln(ai); qsort(1,n); 快速排序 i:=1; j:=n; s:=0; while i=j do 贪心法 begin if i=j then begin s:=s+1; break; end; if ai+ajw then begin s:=s+

10、1; j:=j-1; end; end; writeln(s); close(input); close(output); end. 【深入思考】 快速排序的程序比较难编,是否能有一种比较好编得排序方法呢?答案是肯定的。设p数组的下标为5至200,每读入一个数字x,就将px加1,这样数字全部读入后就是有序的了,效率甚至比快速排序还高。这样的话贪心部分也要有所改变。 【参考程序2】 program a2_2(input,output); var p:array5.200 of integer; x,i,w,n,j,s:integer; begin assign(input,group.in);

11、assign(output,group.out); reset(input); rewrite(output); readln(w); readln(n); for i:=5 to 200 do pi:=0; 数组清0 for i:=1 to n do 读入数据 begin readln(x); px:=px+1; end; i:=5; j:=200; s:=0; while ij then break; if i=j then 处理i=j的情况 if i*2=2 do begin pi:=pi-2; s:=s+1; end; s:=s+pi; end else s:=s+pi; if i+j

12、=w then 处理i+jpj then begin s:=s+pj; pi:=pi-pj; pj:=0; end else begin s:=s+pi; pj:=pj-pi; pi:=0; end; if i+jw then 处理i+jw的情况 begin s:=s+pj; pj:=0; end; end; writeln(s); close(input); close(output); end. 3、守望者的逃离 (escape.pas/c/cpp) 【问题描述】 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的

13、大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。 现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务写写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数

14、秒。距离的单位为米(m)。 【输入】 在输入文件escape.in仅一行,包括空格隔开的三个非负整数M,S,T。 【输出】 在输出文件escape.out包括两行: 第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。 第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。 【输入输出样例1】 escape.in escape.out 39 200 4 No 197 【输入输出样例1】 escape.in escape.out 36 255 10 Yes 6 【限制】 30%的数据满足

15、:1=T=10,1=S=100 50%的数据满足:1=T=1000,1=S=10000 100%的数据满足:1=T=300000,0=M=1000,1=S=108. 【试题分析】 典型的动态规划。 设fi,j为第i秒,魔法值为j时可行的最大距离。 fi,j:=maxfi-1,j+17,fi-1,j-10+60,fi-1,j+4 (当j10时); fi,j:=maxfi-1,j+17,fi-1,j+4 (当jb then k:=a else k:=b; if k=s then begin writeln(Yes); 找到最小解,提前退出 writeln(i); close(input); clo

16、se(output); halt; end; end; for j:=10 to m do begin bj:=max(aj+17,aj+4,aj-10+60); 动态规划 if bj=s then begin writeln(Yes); 找到最小解,提前退出 writeln(i); close(input); close(output); halt; end; end; a:=b; end; writeln(No); 无解 writeln(am); close(input); close(output); end. 注:此程序两个点超时 【深入思考】 前面的动态规划时间复杂度太高,是否能想出

17、更优的算法呢?思考一下,可以发现,中间的过程无非就是闪烁加恢复魔法,有时再走几步,我们用ms数组记录,闪烁加恢复魔法可走的最大距离,再和走路比较,选出最优方案,存入ts数组,这样的话,时间复杂度只有O(t),比前面的算法好得多。 【参考程序2】 program a3_2(input,output); var m,s,t,ti:longint; ms:array1.2,0.300000 of longint; ts:array0.300000 of longint; begin assign(input,escape.in); assign(output,escape.out); reset(i

18、nput); rewrite(output); readln(m,s,t); ms2,0:=m; ts0:=0; for ti:=1 to t do 动态规划 begin if ms2,ti-1=10 then 如果能使用闪烁,就是用 begin ms1,ti:=ms1,ti-1+60; ms2,ti:=ms2,ti-1-10; end else begin ms1,ti:=ms1,ti-1; 恢复魔法值 ms2,ti:=ms2,ti-1+4; end; if tsti-1+17ms1,ti then tsti:=tsti-1+17 else tsti:=ms1,ti; 找出大的值 if ts

19、ti=s then 如果顺利逃出,输出结果 begin writeln(Yes); writeln(ti); close(input); close(output); halt; end; end; writeln(No); 无法逃出,输出结果 writeln(tst); close(input); close(output); end. 此程序所有测试点全部通过 4Hanoi双塔问题 (hanoi.pas/c/cpp) 【问题描述】 给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺 寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘足不加区分的(下图为n=3的情

20、形)。现要将 这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求: (1)每次只能移动一个圆盘; (2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序; 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。 【输入】 输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。 【输出】 输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。 【输入输出样例1】 hanoi.in hanoi.out 1 2 【输入输出样例2】 hanoi.in hanoi.out 2 6 【限制】 对于50的数据,1=n=25 对于100的数据,l=n=2 then 减2的处理 a1:=a1-2 else begin a1:=a1+8; a2:=a2-1; end; i:=100; while ai=0 do i:=i-1; 计算位数 for j:=i downto 1 do write(aj); 反序输出 writeln; close(input); close(output); end.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1