77范文网 - 专业文章范例文档资料分享平台

Noip初赛复习指南、题目分类解析(5)

来源:网络收集 时间:2019-08-03 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

end; jk:=jk-1 end; 3)

j1:=1;

while a[j1]=0 do j1:=j1+1;

for Jk:=j1 to 20 do write(a[jk]:4); writeln

从前往后,找到<>0的位置开始,输出数组元素的值(输出结果),也不要管它。 块2最重要。

它的思想是:每次取Y的最第位y1,执行<<运算>>y1次,每次把jk减1。 现在最重要的是<<运算>>中的在干什么? 注意到最后输出的a[],要留意a[]的变化!

a[e]总是取个位(g mod 10),g每次少一位,和a[e-1](别忘了e在循环!)相加... 难道是...高精度加法???RIGHT!

它执行了y1次,y1每次都是y的个位!对了。程序就是在做x*y 所以答案就是 3465*264=914760

再看它的输出格式,输出的应该是:___9___1___4___7___6___0

其实有经验的话,看到g这个变量名和g:=g+a[e]; a[e]:=g mod 10;这几个标志句子。就可以一下子知道程序的用意了。

总结一下本题:重点考循环嵌套的执行过程以及对除法运算中的商、余数的基本方法;主要程序段可以通过列表了解变量的变化情况;要细心、耐心;题目的本身没有多少值得研究的价值!!!但有些题目纯粹考算法思路,如下面的例子:

? 2. 算法题

program ex2;

var i,j,n:longint;

b:array [0..31] of 0..1; begin

n=1999; i:=0;

while n<>0 do begin

b[i]:=n mod 2; i:=i+1; n:=n div 2 end;

for j:=i-1 downto 0 do write(b[j]); end.

输出什么?

解答:很明显,是把十进制整数转换成二进制数,所以输出11111001111

? 3.有些题目则是考数学,或根据一些基本规则重复地做某个操作。如:

program exp1 (imput,output); var i,,s,max: integer;

a:array [1..10] of integer;

21

begin

for i:=1 to 10 do read (a[i]); max:=a[1] ;s:=a[1]; for i:=2 to 10 do begin

if s<0 then s:=0; s:= s+a[i];

if s>max then max:=s end;

writeln(‘max=’, max) end.

输入:8 9 -1 24 6 5 11 15 -28 9 输出:max=

解答:本题主要做累加:s:= s+a[i];再根据结果打擂台。

但最关键的语句是:if s<0 then s:=0;它的作用是把s<0的前若干个元素的和值屏蔽掉(置0)。

了解了这一点,题目就很简单了。步骤如下:

s<0? s=8 s>max? max=8;

I=2 N 8+9=17 Y max=17; I=3 N 17-1=16 N max=17; I=4 N 16+24=40 Y max=40; I=5 N 10+6=46 Y max=46; I=6 N 46+5=51 Y max=51; I=7 N 51+11=62 Y max=62; I=8 N 62+15=77 Y max=77; I=9 N 77-28=49 N max=77; I=10 N 49+9=58 N max=77;

所以结果为:77。

小结:本质是求一个n长的整数数列的连续x长的子序列,要求子序列的和最大! 注意:s和max!!!另外本题给的输入数据比较简单,所以有很多人没有完全懂也算对了结果,把数据改成如下:-1 12 -103 65 34 -4 -27 8 -1234 9,问结果是多少呢?答:9!!!

? 4.考子程序的调用,尤其是递归或带参数(值参与变量型参数),如:

PROGRAM EX3; CONST N=10;

VAR S,I : INTEGER;

FUNCTION CO(I1:INTEGER) : INTEGER; VAR J1,S1 : INTEGER; BEGIN S1:=N;

FOR J1:= (N-1) DOWNTO (N-I1+1) DO S1:= S1*J1 DIV (N-J1+1); CO:=S1 END; BEGIN S:=N+1;

FOR I:= 2 TO N DO S:=S + CO(I); WRITELN(‘S=’,S); END.

22

解答过程:

(1) 如果有子程序,一般先读主程序,了解主程序什么时候调用子程序?干什么的?调用了多少

次?本题调用了n-1次,并且累加函数的返回值!

(2) 再单独阅读子程序,分析变量、参数和返回值,确定它的功能。本题函数猛一看好象比较复杂,

不过是通过一个循环结构完成累乘和累除,下面再具体分析!

(3) 通过列表,观察子程序中的变量变化情况,以便找出规律,确定子程序的作用。本题如下:

CO(2)=10*9/2 CO(3)=10*9*8/2/3 CO(4)=10*9*8*7/2/3/4 ??

发现,好象是组合数学的公式:CO(i)=10!/(i!*(10-i)!) 即:C(m,n)=m!/(n!*(m-n)!)=m*(m-1)*??*(m-n+1)/n!

(4) 所以结果很明确:C(10,0)+ C(10,1)+??+C(10,9)+ C(10,10)=722

总结:灵感来源于丰富的数学基础和经验!

第四部分:完善程序(28分)

这部分题目得分率很低。没关系,尽量做吧。实在不会把一些简单的填好就行了。有些题目即使不懂也能填出来:)比如:i:=i+1;i:=0;

注意经常问自己程序中有没有做下面的事:

1)初始化(i:=0; j:=0; for i:=1 to n do a[i]:=0之类的) 2)一些明显的动作:

a.结果没有储存在需要的地方。 b.累加器没有做加法 c.输出 3)关键动作。

例如交换排序程序的“交换”操作等很明显需要完成的操作。

分析方法和写运行结果类似,注意分析变量和程序结构,理解变量和模块的作用是解题的关键。 不熟练是不妨用自然语言描述一下。

一般的解题步骤:

1. 仔细阅读程序的目的和算法、数据结构的描述!

千万不要一激动一紧张,题目都没看透彻!!!

2. 把程序中的变量和题目中数据结构描述结合起来,记住关键变量的作用!

有时就能填出一些简单的空!!!不信?!!!

3. 结合问题的算法描述和要求及步骤,把程序划分成几段,每段完成指定的功能!

千万不要忘记:这是完善程序,不是让你自己编!!!一定要不断地结合题意和程序。 4. 逐步解决每段!

注意不要因为个别空而影响你对整个程序的把握,不知道的,先空在那儿,把知道的填好,最后再收拾那些难点!!!

注意一定要提醒自己:程序中有没有做那些最基本的事。

5. 做完后,不要忘了把程序从前往后读两遍,看看是否完成了题目的任务;还要检查一些细节性的问题,

如“>”还是“>=”,是n-i,还是n-i+1? 下面举例给予说明。

? 1.基础题(算法、数据结构很清楚、很朴素,送分!)

[程序的说明]

本程序对随机产生的100个0到50之间的随机数用一个数组存放后进行排序,然后再将其中重复出现的数进行删除,只保留一个,使得剩下的数中任何两个都不相同且连续存储在原数组中。 const maxn=100;

23

type arraytype=array [1..maxn] of integer; var i,j,temp,current,tail:integer; a:arraytype; begin

randomize;

for i:=1 to maxn do a[i]:=random(51); for i:=1 to __ ① do

for j:= _ ② _ to maxn do if a[i]

begin temp:=a[i];a[i]:=a[j];a[j]:=temp end; for i:=2 to maxn do

if __ ③ __ then a[i]:=-a[i]; tail:=0;current:=1;

while _____ ④ _____ do begin

while a[current]<0 do current:=current+1; tail:=tail+1;

a[tail]:= __⑤__ ; current:=current+1 end;

if ___⑥__ then begin tail:=tail+1; a[tail]:=0 end; for i:=1 to tail do write(a[i]:5); writeln end. [解答]

程序的思想已经不能再清楚了,因为要排序(很明显是冒泡排序),所以: ①maxn-1 ②i+1

那么如何删除呢?先分析一下变量的含义,current和tail分别表示队列的头尾指针。再看删的过程:好象是先做标记(置为负!),然后从队首current开始找第1个没被做标记(>0)的数,把它放到当前队尾tail的下一个位置。所以:

③a[i]=abs(a[i-1])

④(current<=maxn) and (a[current]<>0) ⑤a[current]

⑥(a[tail]<>0) and (a[current]=0)

? 2.关键变量+特定的思想方法+灵感(1995年初中组2)

找出小于33的6个正整数,用这些整数进行加法运算,使得包括原来的整数在内能组成尽可能多的不同整数。

例如:用2,3,5这三个数能可组成下面的数: 2, 3, 5, 2 + 3 = 5(但5已经存在)

2 + 5 = 7, 3 + 5 = 8, 2 + 3 + 5 = 10 所以用2,3,5能组成6个不同的数。

程序要求:输出所选的这6个数,以及能组成不同整数的个数。

算法提要:选择的这6个数,用来组成数时应该尽可能不重复,引入数组A保存找出的这6个整数。 主要程序段:

A[1] := 1; t := 0; For i := 2 to 6 do

24

begin

_________①________;

for j := 1 to i - 1 do s := ______②_______; a[i] := _______③_______; end;

For i:=1 to 6 do Begin

t:= ______④______ ; WRITE(a[i], ' ');

End;

Writeln('能组成不同整数的个数:', t)

解答:首先,根据蓝色的程序段,我们应该判断出③应该和s相关,而②是为了计算s,所以本题的关键是变量s的含义。

不要着急,我们研究一下题目的例子和算法提要,发现:选择的6个数(a[i])应该尽可能不重复;且a[i]>a[i-1]而a[i]还要尽可能小;假设现在已求出了a[1]?a[i-1],那么为了满足“能组成尽可能多的不同整数”,则a[i]应该取a[1]+a[2]+?+a[i-1]+1,这样必然要设一个累加器,再看看程序:)还真是!!!所以得到:①初始化s:=0; ②累加s+a[j]; ③赋值,注意多加1:s+1;

那么④怎么填呢?它表示能组成的不同整数的个数,那为什么要扫描一遍数组呢?感觉也应该是累加!其实我们应该充分发挥上面已填好的程序段,发现:6个数为:1 2 4 8 16 32(哦,难怪说小于33!让我更加坚信上面做的是对的!),很明显是二进制数的问题吗?本质上就是一个求一个6位的二进制数最多能

012345

表示多少状态?答案为:2+2+2+2+2+2=1+2+4+8+16+32。不要激动,看题目④填什么?累加:t+a[i]。

? 3.复杂的问题描述+简单的程序+细心地处理细节问题(1995年高中组3)

设有一个实数,以字符串形式存放于数组x中,用x:array[1..N]of char表示。其中x[1]若为'-',表示负数;若为'+'、'.'或' ',则表示正数。若为数字,也认为是正数。 例如 x=(' ','2','0',' ','3','.','5','%') 则表示203.5 x=('-','1','.',' ','2','0','%') 则表示-1.2 约定:在字符串x中,除x[1]外,其后可以包含有若干个'.'与' ',但仅以第一次出现的为准,空格不起任何作用,并以字符'%'作为结束标志。

程序要求:将输入的字符串还原成实数输出(小数点后无用的0应除去),还原的结果以下列形式存放(不需要输出)。

F:数符。正数放0,负数放1。

A:array[1..N] of integer; 存放数字,不放小数点。 K:表示A中有效数字的个数。 J:表示小数点后的位数。

例如:数203.24,还原后结果的存放是: F=0

A=(2, 0, 3, 2, 4) K=5 J=2

又如:数-33.0740,还原后结果的存放是: F=1

A=(3, 3, 0, 7, 4) K=5 J=3

算法提要:x : array[1..10] of char;可放长度定为10;首先读入字符串,然后处理数的符号,在还原的过程中,需要判定整数部分与小数部分,同时去除多余的空格和小数点,并约定输入是正确的,不用作出错

25

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库Noip初赛复习指南、题目分类解析(5)在线全文阅读。

Noip初赛复习指南、题目分类解析(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/676060.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: