nbhkdz.com冰点文库

1999年至2013年历年信息学奥赛提高组初赛试题


第十九届全国青少年信息学奥林匹克联赛初赛
提高组 Pascal 语言试题 竞赛时间:2013 年 10 月 13 日 14:30~16:30
一、单项选择题(共 15 题,每题 1.5 分,共计 22.5 分;每题有且仅有一个正确选项)
1.一个 32 位整型变量占用( )个字节。 A.4 B .8 C.32 D.128 2.二进制数 11.01 在

十进制下是( ) 。 A.3.25 B .4.125 C.6.25 D.11.125 3.下面的故事与( )算法有着异曲同工之妙。 从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“ 从前有座山,山里有座庙,庙 里有个老和尚在给小和尚讲故事: ? 从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故 事…………………………?” A.枚举 B .递归 C.贪心 D.分治 4.1948 年, ( )将热力学中的熵引入信息通信领域,标志着信息论研究的开端。 A.冯· 诺伊曼(John von Neumann) B .图灵(Alan Turing) C.欧拉(Leonhard Euler ) D.克劳德· 香农(Claude Shannon ) 5.已知一棵二叉树有 2013 个节点,则其中至多有( )个节点有 2 个子节点。 A.1006 B .1007 C.1023 D.1024 6.在一个有向图中,如果任意两点之间都存在路径相连,则称其为连通图。右图是一个有 5 个顶点、 8 条边的连通图。若要使它不再是连通图,至少要删去其中的( ) 条边。 A.2 B .3 C.4 D.5 7.斐波那契数列的定义如下:F 1=1, F2=1,Fn=Fn -1+Fn -2(n≥3) 。如 果用下面的函 数计算斐波那契数列的第 n 项,则其时间复杂度为( ) 。 function F(n:longint):longin t; begin if n<=2 then F:=1 else F:=F(n-1)+F(n-2); end; A.O(1) B .O(n) C.O(n 2) D.O(Fn) 8.二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于其右子树上所有节点 的值。那么,二叉查找树的( )是一个有序序列。 A.先序遍历 B .中序遍历 C.后序遍历 D.宽度优先遍历 9.将(2,6 ,10 ,17 )分别存储到某个地址区间为 0~10 的哈希表中,如果哈希函数 h(x)=( ) ,将 不会产生冲突,其中 a mod b 表示 a 除以 b 的余数。 A. x mod 11 B .x2 mod 11 C.2x mod 11 D.

? x ?mod 11,其中 ? x ?表示

x 下取整

10.IPv4 协议使用 32 位地址,随着其不断被分配,地址资源日趋枯竭。因此,它正逐渐被使用( ) 位地址的 IPv6 协议所取代。 A.40 B .48 C.64 D.128 11.二分图是指能将顶点划分成两个部分,每一部分内的顶点间没有边相连的简单无向图。那么 12 个顶 点的二分图至多有( )条边。 A.18 B .24 C.36 D.66 12.( )是一种通用的字符编码,它为世界上绝大部分语言设定了统一并且唯一的二进制编码,以满 足跨语言、跨平台的文本交换。目前它已经收录了超过十万个不同字符。 A.ASCII B .Unicode C.GBK2312 D.BIG5 13.把 64 位非零浮点数强制转换成 32 位浮点数后,不可能( ) 。 A.大于原数 B .小于原数 C.等于原数 D.与原数符号相反 14.对一个 n 个顶点、 m 条边的带权有向简单图用 Dijkstr 算法计算单源最短路时,如果不使用堆或其它

优先队列进行优化,则其时间复杂度为( ) 。 3 2 A.O(mn+n ) B .O(n ) C.O((m+n)log n) D.O((m+n 2)log n) 15.T(n)表示某个算法输入规模为 n 时的运算次数。如果 T(1)为常数,且有递归式 T(n)=2*T(n / 2)+2n ,那 么 T(n) = ( ) 。 A.Θ(n) B .Θ(n log n) C.Θ(n2) D.Θ(n2log n)

二、不定项选择题(共 5 题,每题 1.5 分,共计 7.5 分;每题有一个或多个正确选项,多选 或少选均不得分)
1.下列程序中,正确计算 1,2,…,100 这 100 个自然数之和 sum(初始值为 0)的是( A. for i:=1 to 100 do B . i:=1; sum:=su m+I; while i>100 do begin sum:=su m+I; inc(i); end; C. i:=1; D. i:=1; repeat repeat sum:=su m+I; sum:=su m+I; inc(i); inc(i); until i>100; until i<=100; ) 。

2.( )的平均时间复杂度为 O(n log n),其中 n 是待排序的元素个数。 A.快速排序 B .插入排序 C.冒泡排序 D.归并排序 3.以 A0 作为起点,对下面的无向图进行深度优先遍历时(遍历的顺序与顶点字母的下标无关) ,最后一 个遍历到的顶点可能是( ) 。 A.A1 B .A2 C.A3 D.A4

4.( )属于 NP 类问题。 A.存在一个 P 类问题 B .任何一个 P 类问题 C.任何一个不属于 P 类的问题 D.任何一个在(输入规模的)指数时间内能够解决的问题 5.CCF NOIP 复赛考试结束后,因( )提出的申诉将不会被受理。 A.源程序文件名大小写错误 B .源程序保存在指定文件夹以外的位置 C.输出文件的文件名错误 D.只提交了可执行文件,未提交源程序

三、问题求解(共 2 题,每题 5 分,共计 10 分;每题全部答对得 5 分,没有部分分)
1. 某系统自称使用了一种防窃听的方式验证用户密码。密码是 n 个数 s1,s2,…,sn,均为 0 或 1。该系 统每次随机生成 n 个数 a 1,a 2,…,a n,均为 0 或 1,请用户回答(s1a 1 +s2a 2 +…+sna n)除以 2 的余 数。如果多次的回答总是正确,即认为掌握密码。该系统认为,即使问答的过程被泄露,也无助于破 解密码——因为用户并没有直接发送密码。 然而,事与愿违。例如,当 n=4 时,有人窃听了以下 5 次问答: 系统生成的 n 个数 问答编号 掌握密码的用户的回答 a1 a2 a3 a4 1 1 1 0 0 1 2 0 0 1 1 0 3 0 1 1 0 0

2

4 1 1 1 0 0 5 1 0 0 0 0 就破解出了密码 s1= ,s2= ,s3= ,s4= 。 2. 现有一只青蛙,初始时在 n 号荷叶上。当它某一时刻在 k 号荷叶上时,下一时刻将等概率地随机跳到 1,2,…,k 号荷尔蒙叶之一上,直至跳到 1 号荷叶为止。当 n=2 时,平均一共跳 2 次;当 n=3 时, 平均一共跳 2.5 次。则当 n=5 时,平均一共跳次。

四、阅读程序写结果(共 4 题,每题 8 分,共计 32 分)
1.var n,i:integer; str:string; isPlalindrome:Boolean; begin readln(str); n:=Length(str); isPlalindrome:=true; for i:=1 to (n idv 2) do begin if (str[i]<>str[n-i+1]) then isPlalindrome:=false; end; if (isPlalindrome) then writeln(?Yes?) else writeln(?No?); end. 输入:adceecba 输出: 2.var a,b,u,v,I,num:integer; begin readln(a,b,u,v); num:=0; for i:=a to b do begin if (I mod u=0)or(I mod v=0) then inc(num); end; writeln(num); end. 输入:1 1000 10 15 输出: 3.const SIZE=100; var n,ans,I,j:integer; height,num:array[1..SIZE] of integer; begin read(n); for i:=1 to n do begin read(height[i]); num[i]:=1; for j:=1 to i-1 do begin
3

if ((height[j]<height[i]) and (num[j]>=num[i])) then num[i]:=num[j]+1; end; end; ans:=0; for i:=1 to n do begin if (num[i]>ans) then ans:=ans+num[i]; end; writeln(ans); end. 输入: 8 3 2 5 11 12 7 4 10 输出: 4.const SIZE=100; var n,m,p,count,ans,x,y,I,j:integer; a:array[1..SIZE,1..SIZE] of integer; procedure colour(x,y:integer); begin inc(count); a[x][y]:=1; if (x>1)and(a[x-1][y]=0) then colour(x-1,y); if (y>1)and(a[x][y-1]=0) then colour(x,y-1); if (x<n)and(a[x+1][y]=0) then colour(x+1,y); if (y<m)and(a[x][y+1]=0) then colour(x,y+1); end; begin fillchar(a,sizeof(a),0); readln(n,m,p); for i:=1 to p do begin read(x,y); a[x][y]:=1; end; ans:=0; for i:=1 to n do for j:=1 to m do if a[i][j]=0 then begin count:=0; colour(i,j); if (ans<count) then ans:=count; end; writeln(ans); end. 输入: 659 14

4

23 24 32 41 43 45 54 64 输出:

五、完善程序(第 1 题 15 分,第 2 题 13 分,共计 28 分)
1.(序列重排)全局数组变量 a 定义如下: const int SIZE=100; int a[SIZE],n; 它记录着一个长度为 n 的序列 a[1],a[2],…,a[n]。 现在需要一个函数,以整数 p(1≤p ≤n)为参数,实现如下功能:将序列 a 的前 p 个数与后 n-p 个数对 调,且不改变这 p 个数(或 n-p 个数)之间的相对位置。例如,长度为 5 的序列 1,2,3,4,5,当 p=2 时重排结果为 3,4,5,1,2。 有一种朴素的算法可以实现这一需求,其时间复杂度为 O(n)、空间复杂度为 O(n): procedure swap1(p:longint); var I,j:longint; b:array[1..SIZE] of longint; begin for i:=1 to p do b[ (1) ]:=a[i]; //(2 分) for i:=p+1 to n do b[i-p]:=a[i]; for i:=1 to n do a[i]:=b[i]; end; 我们也可以用时间换空间,使用时间复杂度为 O(n2)、空间复杂度为 O(1)的算法: procedure swap2(p:longint); var I,j,temp:longint; begin for i:=p+1 to n do begin temp:=a[i]; for j:=I downto (2 ) do //(2 分) a[j]:=a[j-1]; (3 ) :=temp; //(2 分) end; end; 事实上,还有一种更好的算法,时间复杂度为 O(n)、空间复杂度为 O(1); procedure swap3(p:longint); var start1,end1,start2,end2,I,j,temp:longin t; begin start1:=1; end1:=p; start2:=p+1; end2:=n; while true do begin
5

i:=star1; j:=start2; while (i<=end1)and(j<=end2) do begin temp:=a[i]; a[i]:=a[j]; a[j]:=temp inc(i); inc(j); end; if i<=end1 then start1:=i else if (4) then //(3 分) begin start1:= (5) ; //(3 分) end1:= (6) ; //(3 分) start2:=j; end else break; end; end; 2.(两元序列)试求一个整数序列中,最长的仅包含两个不同整数的连续子序列。如有多个子序列并列 最长,输出任意一个即可。例如,序列“1 1 2 3 2 3 2 3 3 1 1 1 3 1”中,有两段满足条件的最长子序列, 长度均为 7,分别用下划线和上划线标出。 program two; const SIZE=100; var n,I,j,cur1,cur2,count1,count2, ans_length,ans_start,ans_end:longint; //cur1,cur2 分别表示当前子序列中的两个不同整数 //count1,count2 分别表示 cur1,cur2 在当前子序列中出现的次数 a:array[1..SIZE] of longin t; begin readln(n); for i:=1 to n do read(a[i]); i:=1; j:=1; //i,j 分别表示当前子序列的首尾,并保证其中至多有两个不同整数 while (j<=n)and(a[j]=a[i]) do inc(j); cur1:=a[i]; cur2:=a[j]; count1:= (1) ; //(3 分) count2:=1; ans_length:=j-i+1; while j<n do begin inc(j); if a[j]=cur1 then inc(count1) else if a[j]=cur2 then inc(count2) else begin

6

if a[j-1]= (2) then //(3 分) while count2>0 do begin while count2>0 do begin if a[i]=cur1 then dec(count1) else dec(count2); inc(i); end; cur2:=a[j]; count2:=1; end else begin while count1>0 do begin if a[i]=cur1 then (3 ) //(2 分) else (4 ) ; //(2 分) inc(i); end; (5 ) ; //(3 分) count1:=1; end; end; if (ans_length<j-i+1) then begin ans_length:=j-i+1; ans_start:=I; ans_end:=j; end; end; for i:=ans_start to ans_end do write(a[i],? ?); end.

7

第十八届全国青少年信息学奥林匹克联赛初赛
竞赛时间:2012 年 10 月 13 日 14:30~16:30 一、单项选择题(共 10 题,每题 1.5 分,共计 15 分;每题有且仅有一个正确选项) 1.目前计算机芯片(集成电路)制造的主要原料是( ) ,它是一种可以在沙子中提炼出的物质。 A.硅 B.铜 C.锗 D.铝 2. ( )是主要用于显示网页服务器或者文件系统的 HTML 文件的内容,并让用户与这些文件交互的一 种软件。 A.资源管理器 B.浏览器 C.电子邮件 D.编译器

3.目前个人电脑的( )市场占有率最靠前的厂商包括 Intel、AMD 等公司。 A.显示器 B. CPU C.内存 D.鼠标 4.无论是 TCP/IP 模型还是 OSI 模型,都可以视为网络的分层模型,每个网络协议都会被归入某一层中。 如果用现实生活中的例子来比喻这些“层” ,以下最恰当的是( ) 。 A. 中国公司的经理与波兰公司的经理交互商业文件

B. 军队发布命令

C. 国际会议中,每个人都与他国地位对等的人直接进行会谈

8

D. 体育比赛中,每一级比赛的优胜者晋级上一级比赛

5.如里不在快速排序中引入随机化,有可能导致的后果是( A.数组访问越界 B.陷入死循环 C.排序结果错误 D.排序时间退化为平方级

) 。

6.1946 年诞生于美国宾夕法尼亚大学的 ENIAC 属于( )计算机。 A.电子管 B.晶体管 C.集成电路 D.超大规模集成电路

7.在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。 A.系统分配的栈空间溢出 B.系统分配的堆空间溢出 C.系统分配的队列空间溢出 D.系统分配的链表空间溢出

8.地址总线的位数决定了 CPU 可直接寻址的内存空间大小,例如地址总线为 16 位,其最大的可寻址空 间为 64KB。如果地址总线是 32 位,则理论上最大可寻址的内存空间为( ) 。 A.128KB B.1MB C.1GB D.4GB 9.以下不属于 3G(第三代移动通信技术)标准的是( ) 。 A.GSM B.TD-SCDMA C.CDMA2000 D.WCDMA 10.仿生学的问世开辟了独特的科学技术发展道路。人们研究生物体的结构、功能和工作原理,并将这些 原理移植于新兴的工程技术中。以下关于仿生学的叙述,错误的是( ) A.由研究蝙蝠,发明雷达 C.由研究海豚,发明声纳 B.由研究蜘蛛网,发明因特网 D.由研究电鱼,发明伏特电池

二、不定项选择题(共 10 题,每题 1.5 分,共计 15 分;每题有一个或多个正确选项,多选或少选均不得 分) 1.如果对于所有规模为 n 的输入,一个算法均恰好进行( 度为 O(2 ) 。A. 2
n
n ?1

)次运算,我们可以说该算法的时间复杂

B. 3

n

C. n * 2

n

D. 2

2n

2 . 从顶点 A0 出发,对有 向图 (

)进行广度优 先搜索 ( BFS ) 时, 一种可 能的遍 历顺 序是

A0 , A1 , A2 , A3 , A4 。

9

3.如果一个栈初始时为空,且当前栈中的元素从栈顶到栈底依次为 a,b,c (如右图所示) ,另有元素 d 已经出栈,则可能的入栈顺序是( ) 。 A.a, b, c, d B.b, a, c, d C.a, c, b, d D.d, a, b, c )属于三原色之一。

4.在计算机显示器所使用的 RGB 颜色模型中, ( A.黄色 B.蓝色 C.10 D.15

5.一棵二叉树一共有 19 个节点,其叶子节点可能有( A.1 B.9 C.紫色 D.绿色

)个。

6.已知带权有向图 G 上的所有权值均为正整数,记顶点 u 到顶点 v 的最短路径的权值为 d (u, v) 。若

v1 , v2 , v3 , v4 , v5 是图 G 上的顶点,且它们之间两两都存路径可达,则以下说法正确的有(
A. v1 到 v 2 的最短路径可能包含一个环 B. d (v1 , v2 ) ? d (v2 , v1 ) C. d (v1 , v3 ) ? d (v1 , v2 ) ? d (v2 , v3 ) D . 如 果 v1 ? v2 ? v3 ? v4 ? v是 5 v1 到 v5 的一条最短路径,那么

) 。

v2 ? v3 ? v4 是 v2 到 v4 的一条最短路径
7.逻辑异或( ? )是一种二元运算,其真值表如下所示。 a False False True True b False True False True ) 。

a?b
False True True Flase

以下关于逻辑异或的性质,正确的有( A.交换律: a ? b ? b ? a B.结合律: (a ? b) ? c ? a ? (b ? c)

10

C.关于逻辑与的分配律: a ? (b ? c) ? (a ? b) ? (a ? c) D.关于逻辑或的分配律: a ? (b ? c) ? (a ? b) ? (a ? c) 8.十进制下的无限循环小数(不包括循环节内的数字均为 0 成均为 9 的平凡情况) ,在二进制下有可能是 ( ) 。 A.无限循环小数(不包括循环节内的数字均为 0 或均为 9 的平凡情) B.无限不循环小数 C.有限小数 D.整数 9. ( )是目前互联网上常用的 E-mail 服务协议。 A. HTTP B.FTP C.POP3 D.SMTP 10.以下关于计算复杂度的说法中,正确的有( ) 。 A.如果一个问题不存在多项式时间的算法,那它一定是 NP 类问题 B.如果一个问题不存在多项式时间的算法,那它一定不是 P 类问题 C.如果一个问题不存在多项式空间的算法,那它一定是 NP 类问题 D.如果一个问题不存在多项式空间的算法,那它一定不是 P 类问题 三、问题求解(共 2 题,每题 5 分,共计 10 分) 1. 本题中,我们约定布尔表达式只能包含 p,q,r 三个布尔变量,以及“与” (∧) 、 “或” (∨) 、 “非” (¬)三种布尔运算。如果无论 p,q,r 如何取值,两个布尔表达式的值总是相同,则称它们等价。例如 (p∨q)∨r 和 p∨(q∨r)等价,p∨¬p 和 q∨¬q 也等价;而 p∨q 和 p∧q 不等价。那么两两不等价的布尔表 达式最多有 个。

2. 对于一棵二叉树,独立集是指两两互不相邻的节点构成的集合。例如,图 1 有 5 个不同的独立集(1 个双点集合,3 个单点集合、1 个空集) ,图 2 有 14 个不同的独立集。那么图 3 有 个不同的独立 集。

三、阅读程序写结果。(共 4 题,每题 8 分,共计 32 分) 1. var n,i,temp,sum:integer; a :array[1..100] of integer; begin readln(n); for i:=1 to n do read(a[i]);
11

for i:=1 to n-1 do if a[i]>a[i+1] then begin temp := a[i]; a[i] := a[i+1]; a[i+1] := temp; end; for i:=n downto 2 do if a[i]<a[i-1] then begin temp := a[i]; a[i] := a[i-1]; a[i-1] := temp; end; sum := 0; for i:=2 to n-1 do inc(sum,a[i]); writeln(sum div (n-2)); end. 输入: 8 40 70 50 70 20 40 10 30 输出:______________ 2. var n,i,ans:integer; function gcd(a,b :integer) : integer; begin if a mod b=0 then gcd :=0; else gcd := gcd(b,a mod b); end; begin readln(n); ans := 0; for i:=1 to n do if gcd(n,i)=i then ans := ans + 1;

12

writeln(ans); end. 输入:120 输出:_____________ 3. var data : array[1..20] of integer; n,i,h,ans : integer; procedure merge; begin data[h-1] := data[h-1] + data[h]; dec(h); inc(ans); end; begin readln(n); h := 1; data[h] := 1; ans := 0; for i:=2 to n do begin inc(h); data[h] := 1; while (h>1) and (data[h]=data[h-1]) do merge; end; writeln(ans); end. (1) 输入:8 输出:______________ (4 分) (2) 输入:2012 输出:______________ (4 分)

13

4. var left, right, father :array[1..20] of integer; sl, s2, s3 :string; n,ana :integer; procedure check(x :integer); begin if left[x]>0 then check(left[x)); s3 := s3 + sl[x]; if right[x]>0 then check(right[x]); end; procedure calc(x,dep :integer); begin ans:= ans + dep*(ord(sl[x])-ord('A')+1); if left[x] > 0 then calc(left[x],dep+l); if right[x]> 0 then calc(right[x),dep+l); end; procedure dfs(x,th :integer); begin if th = n+1 then begin s3 :=''; check(1); if s2=s3 then begin ans := 0; calc(1,1); writeln(ans); end; exit; end; if (left[x]=0) and (right[x]=0) then begin left[x) := th; father[th] := x; dfs(th, th+1); father[th] := 0; left[x] := 0;

14

end; if right[x] = 0 then begin right[x] := th; father[th] := X; dfs(th, th+1); father[th] := 0; right[x] := 0; end; if (father[x] > 0) then dfs(father[x],th); end; begin readln(s1); readln(s2); n := length(s1); fillchar(left,sizeof(left),0); fillchar(right,sizeof(right),0); fillcahr(father,sizeof(father),0); dfs(1,2); end. 输入: ABCDEF BCAEDF 输出:____________ 五、完善程序(第 1 题第 2 空 3 分,其余每空 2.5 分,共计 28 分) 1.(排列数)输入两个正整数 n, m(1 ? n ? 20,1 ? m ? n) ,在 1 输出所有这样的排列。例如 输入:3 2 输出:1 2 1 3 2 1 2 3 3 1

n 中任取 m 个数,按字典序从小到大

15

3 2

const SIZE=20; var used :array [1..SIZE] of boolean; data :array [1..SIZE] of integer; n,m,i,j,k :integer; flag :boolean; begin readln(n,m); fillchar(used,sizeof(used),false); for i:=1 to m do begin data[i] := i; used[i] := true; end; flag := true; while flag do begin for i:=1 to m-1 do write(data[i],' '); writeln(data[m]); flag := begin ② begin used[j] := true; data[i] := flag := true; break; end; if flag then begin for k:= i+l to m do for j:= 1 to begin data[k] := j;
16



;

for i := m downto 1 do ;

for j := data[i]+1 to n do if used[j] = false then



;



do if used[j]=false then

used[j] := true; break; end; ⑤ end; end; end; end. 2.(新壳栈)小 Z 设计了一种新的数据结构“新壳栈”。首先,它和传统的栈一样支持压入、弹出操作。 此外,其栈顶的前 c 个元素是它的壳,支持翻转操作。其中,c>2 是一个固定的正整数,表示壳的厚度。 小 Z 还希望,每次操作,无论是压入、弹出还是翻转,都仅用与 c 无关的常数时间完成。聪明的你能帮助 她编程实现“新壳栈”吗? 程序期望的实现效果如以下两表所示。其中,输入的第一行是正整数 c,之后每行输入都是一条指令。 另外,如遇弹出操作时栈为空,或翻转操作时栈中元素不足 c 个,应当输出相应的错误信息。 指令 1[空格]e 2 3 0 涵义 在栈顶压入元素 e 弹出(并输出)栈顶元素 翻转栈顶的前 c 个元素 退出 表 1:指令的涵义 栈中的元素 (左为栈底,右为栈顶) ;

输入 3 1 1 1 2 1 3 1 4 3 1 5 3 2 2 2 3 2 2

输出

说明 输入正整数 c

1 1 2 1 2 3 1 2 3 4 1 4 3 2 1 4 3 2 5 1 4 5 2 3 3 2 5 错误信息 4 1 1 4 5 2 1 4 5 1 4 1 4 1 空
17

压入元素 1 压入元素 2 压入元素 3 压入元素 4 翻转栈顶的前 c 个元素 压入元素 5 翻转栈顶的前 c 个元素 弹出栈顶元素 3 弹出栈顶元素 2 弹出栈顶元素 5 由于栈中元素不足 c 个,无法翻转,故操 作失败,输出错误信息 弹出栈顶元素 4 弹出栈顶元素 1

2 0

错误信息

空 空

由于栈中元素不足 c 个,无法翻转,故操 作失败,输出错误信息 退出 表 2:输入输出样例

const NSIZE = 100000; CSIZE = 1000; var n,c,r,tail,head :longint; s : array[1..NSIZE] of longint; //数组 s 模拟一个栈,n 为栈的元素个数 q :array[1..CSIZE] of longint; //数组 q 模拟一个循环队列,tail 为队尾的下标,head 为队头的下标 direction,empty :boolean; function previous(k :longint) :longint; begin if direction then previous := ((k+c-2) mod c) + 1; else previous := (k mod c) + 1; end; function next(k :longint):longint; begin if direction then ① else next := ((k+c-2) mod c)+1; end; procedure push; var element :longint; begin read(element); if next(head) = tail then begin inc(n); ② ;

tail := next(tail); end; if empty then empty := false else
18

head := next(head); ③ := element; end; procedure pop; begin if empty then begin writeln('Error: the stack is empty!'); exit; end: writeln( ④ );

if tail = head then empty := true else begin head := previous(head); if n > 0 then begin tail := previous(tail); ⑤ dec(n); end; end; end; procedure reverse; var temp :longint; begin if ⑥ = tail then begin direction := not direction; temp := head; head := tail; tail := temp; end else writeln('Error:less than',c,' elements in the stack!'); end; begin readln(c); n := 0; tail := 1; head := 1; empty := true; := s[n];

19

direction := true; repeat read(r); case r of 1 : push; 2 : pop; 3 : reverse; end; until r = 0; end.

20

第十七届(2011)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 两小时完成 )

●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●

一、单项选择题(共 20 题,每题 1.5 分。共计 30 分。每题有且仅有一个正确选项。 ) 1.在二进制下,1100011 +( ) = 1110000。

A.1011 B.1101 C.1010 D.1111 2.字符“A”的 ASCII 码为十六进制 41,则字符“ Z”的 ASCII 码为十六进制的( A.66 B.5A C.50 D.视具体的计算机而定 ) 。 ) 。

3.右图是一棵二叉树,它的先序遍历是( A.ABDEFC 4.寄存器是( A.硬盘

B.DBEFAC C.DFEBCA D.ABCDEF )的重要组成部分。 C.内存 D.中央处理器(CPU) ) 。

B.高速缓存

5.广度优先搜索时,需要用到的数据结构是( A.链表 B.队列 C.栈 D.散列表

6.在使用高级语言编写程序时,一般提到的“空间复杂度”中的“空间”是指( A.程序运行时理论上所占的内存空间 B.程序运行时理论上所占的数组空间 C.程序运行时理论上所占的硬盘空间 D.程序源文件理论上所占的硬盘空间

) 。

7.应用快速排序的分治思想,可以实现一个求第 K 大数的程序。假定不考虑极端的最坏情况,理论上可 以实现的最低的算法时间复杂度为(
2

) 。

A.O(n )B.O(n log n)C.O(n) D.O(1) 8.为解决 Web 应用中的不兼容问题,保障信息的顺利流通, ( CSS 等,并建议开发者遵循。 A.微软 B.美国计算机协会(ACM) C.联台国教科文组织 D.万维网联盟(W3C) )制定了一系列标准,涉及 HTML、XML、

21

9.体育课的铃声响了,同学们都陆续地奔向操场,按老师的要求从高到矮站成一排。每个同学按顺序来 到操场时, 都从排尾走向排头, 找到第一个比自己高的同学, 并站在他的后面。 这种站队的方法类似于 ( 算法。 A.快速排序 B.插入排序 C.冒泡排序 D.归并排序 10.1956 年( )授予肖克利(William Shockley) 、巴丁(John Bardeen)和布拉顿( Walter )

Brattain),以表彰他们对半导体的研究和晶体管效应的发现。 A.诺贝尔物理学奖 B.约翰?冯?诺依曼奖 C.图灵奖 D.高德纳奖(Donald E.Knuth Prize) 二、不定项选择题(共 10 题,每题 1.5 分,共计 15 分。每题有一个或多个正确选项。多选或少选均不 得分。 ) 1.如果根结点的深度记为 1,则一棵恰有 2011 个叶子结点的二叉树的深度可能是( A.10 B.11 C.12 D.2011 ) 。 ) 。

2.在布尔逻辑中,逻辑“或”的性质有( A.交换律:P V Q = Q V P

B.结台律:P V ( Q V R ) = ( P V Q ) V R C.幂等律:P V P = P D.有界律:P V 1 = 1 (1 表示逻辑真) 3.一个正整数在十六进制下有 100 位,则它在二进制下可能有( A.399 B.400 C.401 4.汇编语言( ) 。 D.404 )位。

A.是一种与具体硬件无关的程序设计语言 B.在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试 C.可以直接访问寄存器、内存单元、I/O 端口 D.随着高级语言的诞生,如今已完全被淘汰,不再使用 5.现有一段文言文,要通过二进制哈夫曼编码进行压缩。简单起见,假设这段文言文只由 4 个汉字“之” 、 “乎” 、 “者” 、 “也”组成,它们出现的次数分别为 700、600、300、400。那么, “也”字的编码长度可 能是( ) 。 D.4

A.1 B.2 C.3

22

6.生物特征识别,是利用人体本身的生物特征进行身份认证的一种技术。目前,指纹识别、虹膜识别、 人脸识别等技术己广泛应用于政府、银行、安全防卫等领域。以下属于生物特征识别技术及其应用的是



) 。

A.指静脉验证 B.步态验证 C.ATM 机密码验证 D.声音验证 7.对于序列“7、5、 1、9、3 、6、8、 4” ,在不改变顺序的情况下,去掉( 3。 A.7 B.5 C.3 D.6 )会使逆序对的个数减少

8.计算机中的数值信息分为整数和实数(浮点数) 。实数之所以能表示很大或者很小的数,是由于使用了 ( ) 。 C.反码 D.较长的尾数

A.阶码 B.补码

9.对右图使用 Dijkstra 算法计算 S 点到其余各点的最短路径 长度时,到 B 点的距离 d[B]初始时赋为 8,在算法的执行过程 中还会出现的值有( ) 。

A.3 B.7 C.6 D.5

10. 为计算机网络中进行数据交换而建立的规则、 标准或约定的集合成为网络协议。 下列英文缩写中, ( 是网络协议。 A.HTTP B.TCP/IP C.FTP D.WWW



三、问题求解(共 2 题,每题 5 分,共计 10 分) 1.平面图是可以画在在平面上,且它的边仅在顶点上才能相交的简单 无向图。4 个顶点的平面图至多有 6 条边,如右图所示。那么,5 个顶 点的平面图至多有______条边。

2.定义一种字符串操作,一次可以将其中一个元素移到任意位置。举例说明,对于字符串”BcA”,可以 将 A 移到 B 之前,变成字符串”ABC”。如果要将字符串”DACHEBGIF”变成 ”ABCDEFGHI”,最少需要 ________次操作。 四、阅读程序写结果(共 4 题,每题 8 分,共计 32 分)

23

1. Const SIZE = 100;

var n, i, sum, x : integer; a : array[1..SIZE] of integer; begin readln(n); fillchar(a, sizeof(a), 0); for i:= 1 to n do begin read(x); inc(a[x]); end;

i := 0; sum := 0; while sum < (n div 2 + 1) do begin inc(i); sum :=sum + a[i]; end; writeln(i); end.

输入: 11 4 5 6 6 4 3 3 2 3 2 1 输出:

2. var n : integer;

procedure f2(x, y : integer); forward;

24

procedure f1(x, y : integer); begin if x < n then f2(y, x + y); end;

procedure f2(x, y : integer); begin write(x, ’ ’) ; f1(y, x + y); end;

begin readln(n); f1(0, 1); end.

输入:30 输出:_____________

3. const V = 100;

var visited : array[1..v] of boolean; e : array[1..V, 1..V] of integer; n, m, ans, i, j, a, b, c : integer;

procedure dfs(x, len : integer); var I : integer; begin visited[x] := true; if len > ans then ans := len; for i := 1 to n do

25

if (not visited[i]) and (e[x, i] <> -1) then dfs(i, len + e[x, i]); visited[x] := false; end; begin readln(n, m); for i := 1 to n do for j := 1 to n do e[i][j] := -1; for i := 1 to m do begin readln(a, b, c); e[a][b] := c; e[b][a] := c; end; for i := 1 to n do visited[i] := false; ans := 0; for i := 1 to n do dfs(i, 0); writeln(ans); end. 输入: 4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60 输出:__________ 4. const SIZE = 10000; LENGTH = 10;

26

var sum : longint; n, m, i, j : integer; a : array[1..SIZE, 1..LENGTH] of integer;

function h(u, v : integer) : integer; var ans, i : integer; begin ans := 0; for i := 1 to n do if a[u][i] <> a[v][i] then inc(ans); h := ans; end;

begin readln(n); filichar(a, sizeof(a), 0); m := 1; repeat i := 1; while (i <= n) and (a[m][i] = 1) do inc(i); if i > n then break; inc(m); a[m][i] :=1; for j := i + 1 to n do a[m][j] := a[m - 1][j]; until false; sum :=0; for i := 1 to m do for j := 1 to m do sum := sum + h(i, j); writeln(sum);

27

end.

输入:7 输出:____________

五、完善程序(第 1 题,每空 2 分,第 2 题,每空 3 分,共计 28 分) 1. (大整数开方)输入一个正整数 n(1≤ n<10100) ,试用二分法计算它的平方根的整数部分。 const SIZE = 200;

type hugeint = record len : integer; num : array[1..SIZE] of integer; end; //len 表示大整数的位数;num[1]表示个位、num[2]表示十位,以此类推

var s : string; i : integer; target, left, middle, right : hugeint;

function times(a, b : hugeint) : hugeint: var i, j : integer; ans : hugeint; begin filIchar(ans, sizeof(ans), 0); for i := 1 to a.1en do for j := 1 to b.1en do ___① ___ := ans.num[i + j — 1] + a.num[i] * b.num[j]; for i := 1 to a.len + b.1en do begin ans.num[i + 1] := ans.num[i + 1] + ans.num[i] div 10; ___② ___;

28

if ans.num[a.1en + b.1en] > 0 then ans.len := a.1en + b.1en else ans.len :=a.1en + b.1en – 1; end; times := ans; end;

function add(a, b : hugeint) : hugeint; var i : integer; ans : hugeint; begin fillchar(ans.num, sizeof(ans.num), 0); if a.1en > b.1en then ans.len := a.1en else ans.len := b.len; for i := 1 to ans.1en do begin ans.num[i] :=___③ ___; ans.num[i + 1] := ans.num[i + 1] + ans.num[i] div 10; ans.num[i] := ans.num[i] mod 10; end; if ans.num[ans.1en + 1] > 0 then inc(ans.len); add:=ans; end;

function average(a, b : hugeint) : hugeint; var i : integer; ans : hugeint; begin ans := add(a, b); for i := ans.1en downto 2 do begin ans.num[i - 1] := ans.num[i - 1] + (___④___) * 10; ans.num[i] := ans.num[i] div 2; end;

29

ans.num[i] := ans.num[i] div 2; if ans.num[ans.len] = 0 then dec(ans.len); average := ans; end;

function plustwo(a : hugeint) : hugeint; var i : integer; ans : hugeint; begin ans := a; ans.num[1] := ans.num[1] + 2; i := 1; while(i <= ans.len) and (ans.num[i] >= 10) do begin ans.num[i + 1] := ans.num[i + 1] + ans.num[i] div 10; ans.num[i] := ans.num[i] mod 10; inc(i); end; if ans.num[ans.len + 1] > 0 then___⑤___; plustwo := ans; end;

function over(a, b : hugeint) : boolean; var i : integer; begin if(___⑥ ___)then begin over := false; exit; end; if a.1en > b.1en then begin over := true; exit;

30

end; for i := a.len downto 1 do begin if a.num[i] < b.num[i] then begin over := false; exit; end; if a.num[i] > b.num[i] then begin over := true; exit; end; end; over := false; end;’

begin readln(s); fillchar(target.num, sizeof(target.num), 0); target.1en := 1ength(s); for i := 1 to target.1en do target.num[i] := ord(s[target.1en – i + 1]) - ___⑦___; filichar(left.num, sizeof(1eft.num), 0); left.1en := 1; left.num[i] := 1; right := target; repeat middle := average(1eft, right); if over(___⑧ ___) then right := middle else 1eft := middle; until over(plustwo(1eft), right); for i := left.1en downto 1 do write(1eft.num[i]); writeln; end.

31

2. (笛卡尔树)对于一个给定的两两不等的正整数序列,笛卡尔树是这样的一棵二叉树:首先,它是一 个最小堆,即除了根结点外,每个结点的权值都大于父节点的权值;其次,它的中序遍历恰好就是给定的 序列。例如,对于序列 7、2、12、1、 10、 5、15、 3,下图就是一棵对应的笛卡尔树。现输入序列的规 模 n(1≤n<100 )和序列的 n 个元素,试求其对应的笛号尔树的深度 d(根节点深度为 1) ,以及有多少个 叶节点的深度为 d。

const SIZE = 100; INFINITY = 1000000;

var n, maxDeep, num, i : integer; a : array[1..SIZE] of integer;

procedure solve(1eft, right, deep : integer); var i, j, min : integer; begin if deep > maxDeep then begin maxDeep := deep; num := 1; end else if deep = maxDeep then ___① ___;

min := INFINITY; for i := 1eft to right do if min > a[i] then begin min := a[i]; ___② ___; end; if left < j then ___③ ___; if j < right then

32

___④ ___; end;

begin readln(n); for i := 1 to n do read(a[i]); maxDeep := 0; solve(1, n, 1); writeln(maxDeep, ‘ ’, num); end.

33

第十六届(2010)全国青少年信息学奥林匹克联赛初赛试题
( 提高组
●●
一、单项选择题 1. 与 16 进制数 A1.2 等值的 10 进制数是 ( )A.101.2 B.111.4 C.161.125 D.177.25 2. 一个字节(byte )由( )个二进制组成。 A.8 B.16 C.32 D. 以上都有可能 )。

Pascal 语言 二小时完成 )
●●

全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

3. 以下逻辑表达式的值恒为真的是( A.P∨(┓P∧Q)∨(┓P∧┓Q)

B.Q∨(┓P∧Q)∨(P∧┓Q)

C.P∨Q∨(P∧┓Q)∨(┓P∧Q) D.P∨┓Q∨(P∧┓Q)∨(┓P∧┓Q) 4.Linux 下可执行文件的默认扩展名是( ) 。 A. exe B. com C. dll D. 以上都不是

5. 如果在某个进制下等式 7*7=41 成立,那么在该进制下等式 12*12= ( )也成立。 A. 100 B. 144 C. 164 D. 196 6. 提出“存储程序”的计算机工作原理的是( )。 A. 克劳德?香农 B. 戈登?摩尔 C. 查尔斯?巴比奇 D. 冯?诺依曼 7. 前缀表达式“+ 3 * 2 + 5 12 ” 的值是( )。A. 23 B. 25 C. 37 D. 65

8. 主存储器的存取速度比中央处理器(CPU) 的工作速度慢的多,从而使得后者的效率受到影响。而根据局部性原 理,CPU 所访问的存储单元通常都趋于一个较小的连续区域中。于是,为了提高系统整体的执行效率,在 CPU 中引入了( ) 。A. 寄存器 B. 高速缓存 C. 闪存 D. 外存

9. 完全二叉树的顺序存储方案,是指将完全二叉树的结点从上到下、从左到右依次存放到一个顺序结构的数组 中。假定根结点存放在数组的 1 号位置上,则第 k 号结点的父结点如果存在的话,应当存放在数组中的( 号位置。 A. 2k B. 2k+1 C. k/2 下取整 D. (k+1)/2 10. 以下竞赛活动中历史最悠久的是( 二、不定项选择题 1. 元素 R1 、R2 、R3 、R4 、R5 入栈的顺序为 R1 、R2 、R3 、R4 、R5 。如果第 1 个出栈的是 R3 ,那么第 5 个出栈的 可能是( ) 。A.R1 B.R2 C.R4 D.R5 B. 自然语言 C. 解释性语言 D. 编译性语言 2. Pascal 语言,C 语言和 C++ 语言都属于( ) 。A. 高级语言 )。A. NOIP B.NOI C. IOI D. APIO )

3. 原地排序是指在排序过程中( 除了存储待排序元素以外的) 辅助空间的大小与数据规模无关的排序算法。 以下 属于原地排序的有( ) 。A. 冒泡排序 B. 插入排序 )。 C. 基数排序 D. 选择排序

4. 在整数的补码表示法中,以下说法正确的是(

A .只有负整数的编码最高位为 1 B .在编码的位数确定后,所能表示的最小整数和最大整数的绝对值相同 C .整数 0 只有一个唯一的编码 D .两个用补码表示的数相加时,若在最高位产生进位,则表示运算溢出 5. 一颗二叉树的前序遍历序列是 ABCDEFG ,后序遍历序列是 CBFEGDA ,则根结点的左子树的结点个数可能是 ( )。 A .0 B. 2 C. 4 D. 6 )。

6. 在下列 HTML 语句中,可以正确产生一个指向 NOI 官方网站的超链接的是( A .<a url=”h t t p : / / w w w . n o i . c n”>欢迎访问 NOI 网站</a> B .<a href=”h t t p : / / w w w . n o i . c n”> 欢迎访问 NOI 网站</a> C .<a>h t t p : / / w w w . n o i . c n</a>

34

D .<a name”h t t p : / / w w w . n o i . c n”> 欢迎访问 NOI 网站</a> 7. 关于拓扑排序,下列说法正确的是( A .所有连通的有向图都可以实现拓扑排序 B .对同一个图而言,拓扑排序的结构是唯一的 C .拓扑排序中入度为 0 的结点总会排在入度大于 0 的结点的前面 D .拓扑排序结果序列中的第一个结点一定是入度大于 0 的点 8. 一个平面的法线是指与该平面垂直的直线。过点(1,1,1) 、(0,3,0 )、(2,0,0) 的平面的法线是( A .过点(1 ,1 ,1 )、(2 ,3 ,3 )的直线 B .过点(1 ,1 ,1 )、(3 ,2 ,1 )的直线 C .过点(0 ,3 ,0 )、(-3 ,1 ,1 )的直线 D .过点(2 ,0 ,0 )、(5 ,2 ,1 )的直线 9. 双向链表中有两个指针域 llink 和 rlink ,分别指向该结点的前驱及后继。设 p 指向链表中的一个结点,他 的左右结点均为非空。现要求删除结点 p ,则下列语句序列中正确的是( A .p->rlink->llink=p->rlink; p->llink->rlink=p->llink; delete p; B .p->llink->rlink=p->rlink; p->rlink->llink = p->llink; delete p; C .p->rlink->llink = p->llink; p->rlink->llink ->rlink = p->rlink; delete p; D .p->llink->rlink = p->rlink; p->llink->rlink->link = p->llink; delete p; 10. 今年(2010 年) 发生的事件有( )。 )。 )。 )。

A .惠普实验室研究员 Vinay Deolalikar 自称证明了 P≠NP B .英特尔公司收购计算机安全软件公司迈克菲(McAfee) C .苹果公司发布 iPhone 4 手机 D .微软公司发布 Windows 7 操作系统 三、问题求解 1 .LZW 编码是一种自适应词典编码。在编码的过程中,开始时只有一部基础构造元素的编码词典,如果在编码 的过程中遇到一个新的词条,则该词条及一个新的编码会被追加到词典中,并用于后继信息的编码。 举例说明,考虑一个待编码的信息串:“xyx yy yy xyx”。初始词典只有 3 个条目,第一个为 x, 编码为 1 ;第二个为 y ,编码为 2 ;第三个为空格,编码为 3 ;于是串“xyx”的编码为 1-2-1 (其中- 为编码分隔符), 加上后面的一个空格就是 1-2-1-3 。但由于有了一个空格,我们就知道前面的“xyx”是一个单词,而由于该单 词没有在词典中,我们就可以自适应的把这个词条添加到词典里,编码为 4 ,然后按照新的词典对后继信息进 行编码,以此类推。于是,最后得到编码:1-2-1-3-2-2-3-5-3-4 。 我们可以看到,信息被压缩了。压缩好的信息传递到接受方,接收方也只要根据基础词典就可以完成对该 序列的完全恢复。解码过程是编码过程的逆操作。现在已知初始词典的 3 个条目如上述,接收端收到的编码信 息为 2-2-1-2-3-1-1-3-4-3-1-2-1-3-5-3-6 ,则解码后的信息串是”____________”。 2. 无向图 G 有 7 个顶点,若不存在由奇数条边构成的简单回路,则它至多有__________ 条边。 3. 记 T 为一队列,初始时为空,现有 n 个总和不超过 32 的正整数依次入列。如果无论这些数具体为何值,都能 找到一种出队的方式,使得存在某个时刻队列 T 中的数之和恰好为 9 ,那么 n 的最小值是___________ 。 四、阅读程序写结果

1. const size = 10; var i, j, cnt, n, m : integer;
35

data : array[1..size] of integer; begin readln(n, m); for i := 1 to n do read(data[i]);

for i := 1 to n do begin cnt := 0; for j := 1 to n do if (data[i] < data[j]) or ((data[j] = data[i]) and (j < i)) then inc(cnt); if cnt = m then writeln(data[i]); end; end. 输入 5 2 96 -8 0 16 87 输出:__________ 2. const size = 100; var na, nb, i, j, k : integer; a, b : array[1..size] of integer; begin readln(na); for i := 1 to na do read(a[i]); readln(nb); for i := 1 to nb do read(b[i]); i := 1; j := 1; while (i <= na) and (j <= nb) do begin if a[i] <= b[j] then begin write(a[i],' '); inc(i); end else begin write(b[j], ' '); inc(j); end; end; if i <= na then for k := i to na do write(a[k], ' '); if j <= nb then for k := j to nb do write(b[k], ' '); end. 输入 5 1 3 5 7 9
36

4 2 6 10 14 输出:__________ 3. const num = 5; var n: integer; function r(n : integer) : integer; var i : integer; begin if n <= num then begin r := n; exit; end; for i :=1 to num do if r(n-i) < 0 then begin r:=i; exit; end; r:=-1; end; begin readln(n); writeln(r(n)); end. 输入 16 输出:__________ 4. const size=100; var n,m,x,y,i :integer; r: array[1.. size] of integer; map : array[1..size, 1..size] of boolean; found : boolean; function successful : boolean; var i : integer; begin for i :=1 to n do if not map[r[i]][r[i mod n + 1]] then begin successful := false; exit; end; successful :=true; end;

procedure swap(var a, b : integer); var t : integer; begin t := a; a := b; b := t; end; procedure perm(left, right : integer); var i : integer; begin if found then exit; if left > right then begin if successful then begin for i := 1 to n do writeln(r[i], ' '); found := true; end; exit; end; for i:= left to right do begin swap(r[left], r[i]); perm(left + 1, right); swap(r[left], r[i]); end; end; begin readln(n, m); fillchar(map, sizeof(map), false); for i := 1 to m do begin readln(x, y); map[x][y] := true; map[y][x] := true; end; for i := 1 to n do r[i] := i; found := false; perm(1, n); if not found then writeln('No soloution'); end. 输入: 9 12 1 2 2 3 3 4
37

4 5 5 6 6 1 1 7 2 7 3 8 4 8 5 9 6 9 输出:__________ 五、完善程序
1.(过河问题) 在一个月黑风高的夜晚,有一群人在河的右 岸,想通过唯一的一根独木桥走到河的左岸.在伸手不见五 指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只 有一盏灯.另外,独木桥上最多能承受两个人同时经过,否则 将会坍塌.每个人单独过独木桥都需要一定的时间,不同的 人要的时间可能不同.两个人一起过独木桥时,由于只有一 盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时 间.现在输入 N(2<=N<1000)和这 N 个人单独过桥需要的时间, 请计算总共最少需要多少时间,他们才能全部到达河左岸. 例如,有 3 个人甲、乙、丙,他们单独过桥的时间分别 为1 甲 2 4,则总共最少需要的时间为 7.具体方法是:

乙一起过桥到河的左岸,甲单独回到河的右岸将灯带

回,然后甲,丙在一起过桥到河的左岸,总时间为 2+1+4=7.

const SIZE = 100; INFINITY = 10000; LEFT = true; RIGHT = false; LEFT_TO_RIGHT = true; RIGHT_TO_LEFT = false; var n, i : integer; time : array[1..Size] of integer; pos :array[1..Size] of Boolean; function max(a, b :integer) : integer; begin if a > b then max := a else max := b; end; function go(stage : boolean) : integer; var i, j, num, tmp, ans : integer; begin if (stage = RIGHT_TO_LEFT) then begin num := 0; ans :=0;

for i := 1 to n do if pos[i] = Rignt then begin inc(num); if time[i] > ans then ans := time[i]; end; if __________ then begin go := ans; exit; end; ans := INFINITY; for i := 1 to n – 1 do if pos[i] = RIGHT then for j := i+1 to n do if pos[j] = RIGHT then begin pos[i] := LEFT; pos[j] := LEFT; tmp := max(time[i], time[j]) + _______; if tmp < ans then ans := tmp; pos[i] := RIGHT; pos[j] := RIGHT; end; go := ans; end else if (stage = LEFT_TO_RIGHT) then begin ans := INFINITY; for i := 1 to n do if _______ then begin pos[i] := RIGHT; tmp := ________; if tmp < ans then ans := tmp; _________; end; go := ans; end else go := 0; end; begin readln(n); for i := 1 to n do begin read(time[i]); pos[i] := RIGHT; end; writeln(go(RIGHT_TO_LEFT)); end.

38

第十五届(2009)全国青少年信息学奥林匹克联赛初赛试题
( 提高组
●●

Pascal 语言 二小时完成 )
●●

全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一. 单项选择题 (共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案。 ) 1、关于图灵机下面的说法哪个是正确的: A) 图灵机是世界上最早的电子计算机。 B) 由于大量使用磁带操作,图灵机运行速度很慢。 C) 图灵机只是一个理论上的计算模型。 D) 图灵机是英国人图灵发明的,在二战中为破译德军的密码发挥了重要作用。 2、关于 BIOS 下面的说法哪个是正确的: A) BIOS 是计算机基本输入输出系统软件的简称。 B) BIOS 里包含了键盘、鼠标、声卡、图形界面显器等常用输入输出设备的驱动程序。 C) BIOS 一般由操作系统厂商来开发完成。 D) BIOS 能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。 3、已知大写字母A的 ASCII 编码为65(十进制) ,则大写字母J 的 十六进制 ASCII 编码为: A) 48 B) 49 C) 50 D) 以上都不是 4、在字长为 16 位的系统环境下,一个 16 位带符号整数的二进制补码为 1111111111101101。 其对应的十进制整数应该是: A) 19 B) -19 C) 18 D) -18

5、一个包含 n 个分支结点(非叶结点)的非空满 k 叉树,k>=1,它的叶结点数目为: A) nk + 1 B) nk-1 C) (k+1)n-1 D. (k-1)n+1

6. 表达式 a*(b+c) -d 的后缀表达式是: A) abcd*+B) abc+*dC) abc*+dD) -+*abcd

7、最优前缀编码,也称 Huffman 编码。这种编码组合的特点是对于较频繁使用的元素给与较 短的唯一编码,以提高通讯的效率。下面编码组合哪一组不是合法的前缀编码。 A)(00,01,10,11) B)(0,1,00, 11) C)(0,10,110,111) D)(1,01,000,001)

39

8、快速排序平均情况和最坏情况下的算法时间复杂度分别为: A) 平均情况 O(nlog2 n),最坏情况 O(n2) B) 平均情况 O(n), C) 平均情况 O(n), 最坏情况 O(n ) 最坏情况 O(nlog2 n)
2 2

D) 平均情况 O(log2 n), 最坏情况 O(n ) 9、左图给出了一个加权无向图,从 顶点 V0 开始用 prim 算法求最小生成 树。则依次加入最小生成树的顶点 集合的顶点序列为: A) B) C) D) V0, V1, V2, V3, V5, V4 V0, V1, V5, V4, V3, V3 V1, V2, V3, V0, V5, V4 V1, V2, V3, V0, V4, V5

10、 全国信息学奥林匹克的官方网站为参与信息学竞赛的老师同学们提供相关的信息和资源, 请问全国信息学奥林匹克官方网站的网址是: A) http://www.noi.com/ B) http://www.noi.org/ C) http://www.noi.cn/ D) http://www.xinxixue.com/ 二. 不定项选择题 (共 10 题,每题 1.5 分,共计 15 分。每题正确答案的个数不少于 1。多 选或少选均不得分) 。 1、关于 CPU 下面哪些说法是正确的: A) CPU 全称为中央处理器(或中央处理单元) 。 B) CPU 能直接运行机器语言。 C) CPU 最早是由 Intel 公司发明的。 D) 同样主频下,32 位的 CPU 比 16 位的 CPU 运行速度快一倍。 2、关于计算机内存下面的说法哪些是正确的: A) 随机存储器(RAM)的意思是当程序运行时,每次具体分配给程序的内存位置是随机 而不确定的。 B) 一般的个人计算机在同一时刻只能存/取一个特定的内存单元。 C) 计算机内存严格说来包括主存(memory) 、高速缓存(cache)和寄存器(register )三 个部分。 D) 1MB 内存通常是指 1024*1024 字节大小的内存。 3、关于操作系统下面说法哪些是正确的:
40

A. B. C. D.

多任务操作系统专用于多核心或多个 CPU 架构的计算机系统的管理。 在操作系统的管理下,一个完整的程序在运行过程中可以被部分存放在内存中。 分时系统让多个用户可以共享一台主机的运算能力, 为保证每个用户都得到及时的响 应通常会采用时间片轮转调度的策略。 为了方便上层应用程序的开发,操作系统都是免费开源的。

4、关于计算机网络,下面的说法哪些是正确的: A) 网络协议之所以有很多层主要是由于新技术需要兼容过去老的实现方案。 B) C) 新一代互联网使用的 IPv6 标准是 IPv5 标准的升级与补充。 TCP/IP 是互联网的基础协议簇,包含有 TCP 和 IP 等网络与传输层的通讯协议。

D) 互联网上每一台入网主机通常都需要使用一个唯一的 IP 地址,否则就必须注册一个 固定的域名来标明其地址。 5、关于 HTML 下面哪些说法是正确的: A) B) C) HTML 全称超文本标记语言,实现了文本、图形、声音乃至视频信息的统一编码。 HTML 不单包含有网页内容信息的描述,同时也包含对网页格式信息的定义。 网页上的超链接只能指向外部的网络资源,本网站网页间的联系通过设置标签来实

现。 D) 点击网页上的超链接从本质上就是按照该链接所隐含的统一资源定位符 (URL) 请求 网络资源或网络服务。 6、若 3 个顶点的无权图 G 的邻接矩阵用数组存储为{{0,1,1},{1,0,1},{0,1,0}}, 假定在具体存储中顶点依次为: v1 ,v2 ,v3 关于该图,下面的说法哪些是正确的: A) 该图是有向图。 B) 该图是强连通的。 C) 该图所有顶点的入度之和减所有顶点的出度之和等于 1。 D) 从 v1 开始的深度优先遍历所经过的顶点序列与广度优先的顶点序列是相同的。 7、在带尾指针(链表指针 clist 指向尾结点)的非空循环单链表中每个结点都以 next 字段的 指针指向下一个节点。假定其中已经有 2 个以上的结点。下面哪些说法是正确的: A) 如果 p 指向一个待插入的新结点,在头部插入一个元素的语句序列为: p^.next:= clist^.next; clist^.next:= p; B) 如果 p 指向一个待插入的新结点,在尾部插入一个元素的语句序列为: p^.next:= clist; clist^.next:= p; C) 在头部删除一个结点的语句序列为: p:= clist^.next; clist^.next:= clist^.next^.next; dispose(p); D) 在尾部删除一个结点的语句序列为。 p:= clist; clist:= clist ^.next; dispose(p); 8、 散列表的地址区间为 0-10, 散列函数为 H(K)=K mod 11。 采用开地址法的线性探查法处理冲
41

突,并将关键字序列 26,25,72,38,8,18,59 存储到散列表中,这些元素存入散列表 的顺序并不确定。假定之前散列表为空,则元素 59 存放在散列表中的可能地址有: A) 5 B) 7 C) 9 D) 10

9、排序算法是稳定的意思是关键码相同的记录排序前后相对位置不发生改变,下列哪些排序 算法是稳定的: A) 插入排序 B) 基数排序 C) 归并排序 D) 冒泡排序

10、在参加 NOI 系列竞赛过程中,下面哪些行为是被严格禁止的: A) 携带书写工具,手表和不具有通讯功能的电子词典进入赛场。 B) 在联机测试中通过手工计算出可能的答案并在程序里直接输出答案来获取分数。 C) 通过互联网搜索取得解题思路。 D) 在提交的程序中启动多个进程以提高程序的执行效率。 三.问题求解(共 2 题,每空 5 分,共计 10 分) 1. 拓扑排序是指将有向无环图 G 中的所有顶点排成一个线性序列, 使得图中任意一对顶 点 u 和 v,若<u,v> ∈E(G),则 u 在线性序列中出现在 v 之前,这样的线性序列成为拓扑序 列。如下的有向无环图,对其顶点做拓扑排序,则所有可能的拓扑序列的个数为 。 5 6 1 4 7 9 8

2

3

2.某个国家的钱币面值有 1, 7, 72, 73 共计四种,如果要用现金付清 10015 元的货物,假 设买卖双方各种钱币的数量无限且允许找零,那么交易过程中至少需要流通 四.阅读程序写结果(共 4 题,每题 8 分,共计 32 分) 1.
var a, b: integer;

张钱币。

function work(a, b: integer): integer;

42

begin if a mod b <> 0 then work := work(b, a mod b) else work := b; end;

begin read(a, b); writeln(work(a, b)); end.

输入:123 321 输出:_________

2.
var a, b: array[0..3] of integer; i, j, tmp: integer; begin for i := 0 to 3 do read(b[i]); for i := 0 to 3 do begin a[i] := 0; for j := 0 to i do begin inc(a[i], b[j]); inc(b[a[i] mod 4], a[j]); end; end; tmp := 1; for i := 0 to 3 do begin

43

a[i] := a[i] mod 10; b[i] := b[i] mod 10; tmp := tmp * (a[i] + b[i]); end; writeln(tmp); end.

输入:2 3 5 7 输出:_______________ 3. const y = 2009; maxn = 50; var n, i, j, s: longint; c: array[0..maxn, 0..maxn] of longint; begin s := 0; read(n); c[0, 0] := 1; for i := 1 to n do begin c[i, 0] := 1; for j := 1 to i - 1 do c[i, j] := c[i-1, j-1] + c[i-1, j]; c[i, i] := 1; end; for i := 0 to n do s := (s + c[n, i]) mod y; write(s); end. 输入:17 输出: 4.
44

var n, m, i, j, k, p: integer; a, b: array[0..100] of integer; begin read(n, m); a[0] := n; i := 0; p := 0; k := 0; repeat for j := 0 to i - 1 do if a[i] = a[j] then begin p := 1; k := j; break; end; if p <> 0 then break; b[i] := a[i] div m; a[i+1] := (a[i] mod m) * 10; inc(i); until a[i] = 0; write(b[0], '.'); for j := 1 to k - 1 do write(b[j]); if p <> 0 then write('('); for j := k to i - 1 do write(b[j]); if p <> 0 then write(')'); writeln; end. 输入:5 13 输出:_________ 五.完善程序 (前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分 )

45

1. (最大连续子段和)给出一个数列(元素个数不多于 100) ,数列元素均为负整数、正 整数、0。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在 和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列 中元素的个数。例如数列为 4,-5,3, 2,4 时,输出 9 和 3;数列为 1 2 3 -5 0 7 8 时,输出 16 和 7。 var a: array[1..100] of integer; n, i, ans, len, tmp, beg: integer; begin read(n); for i := 1 to n do read(a[i]); tmp := 0; ans := 0; len := 0; beg := ① ; for i := 1 to n do begin if tmp + a[i] > ans then begin ans := tmp + a[i]; len := i - beg; end else if ( ② len := i - beg; if tmp + a[i] ③ begin beg := tmp := 0; end else ⑤ end; writeln(ans, ' ', len); end. ; ④ ; ) and (i - beg > len) then then

46

2. (寻找等差数列 ) 有一些长度相等的等差数列(数列中每个数都为 0~59 的整数) , 设长度均为 L,将等差数列中的所有数打乱顺序放在一起。现在给你这些打乱后的数,问原 先,L 最大可能为多大?先读入一个数 n(1<=n<=60) ,再读入 n 个数,代表打乱后的数。 输出等差数列最大可能长度 L。 var hash: array[0..60] of integer; n, x, ans, maxnum, i: integer; function work(now: integer): boolean; var ok: boolean; first, second, delta, i: integer; begin while (( ① ) and (hash[now]=0)) do

inc(now); if now > maxnum then begin work := true; exit; end; first := now; for second := first to maxnum do if hash[second] > 0 then begin delta := ② if first + delta * break; if delta = 0 then ok := ( else begin ④ ) ; ③ > maxnum then

ok := true; for i := 0 to ans - 1 do ok := ⑤ and (hash[first+delta*i]>0); end; if ok then begin for i := 0 to ans - 1 do
47

dec(hash[first+delta*i]); if work(first) then begin work := true; exit; end; for i := 0 to ans - 1 do inc(hash[first+delta*i]); end; end; work := false; end; begin fillchar(hash, sizeof(hash), 0); read(n); maxnum := 0; for i := 1 to n do begin read(x); inc(hash[x]); if x > maxnum then maxnum := x; end; for ans := n downto 1 do if (n mod ans = 0) and begin writeln(ans); break; end; end. ⑥ then

48

第十四届全国青少年信息学奥林匹克联赛(2008 年)初赛试题
( 提高组 Pascal 语言 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、单项选择题(共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案) 。 1.在以下各项中, ( A.Solaris B.Linux )不是操作系统软件。 C.Sybase D.Windows Vista E.Symbian

2.微型计算机中,控制器的基本功能是( ) 。 A.控制机器的各个部件协调工作 B.实现算数运算与逻辑运算 C.存储各种控制信息 D.获取外部信息 E.存放程序和数据 3.设字符串 S=“Olympic” ,S 的非空字串的数目是( A.29 B.28 C.16 4.完全二叉树有 2*N-1 的结点,则它的叶子结点数目是( A.N-1 B.2*N C. N ) 。 D.17 ) 。 D.2N -1

E.7

E. N/2

5.将数组{8,23,4,16,77,-5,53,100}中元素从大到小按顺序排序,每次可以交换任 意两个元素,最少要交换( )次。 A.4 B.5 C.6 D.7 E.8

6.设栈 S 的初始状态为空,元素 a,b,c ,d,e,f 依次入栈,出栈顺序为 b,d,c ,f,e, a 那么栈容量至少应该是( A.6 B.5 ) 。 C.4 ) D.130.21 E.130.20 )的数据结构。 E.栈 D.3 E.2

7.与十进制数 28.5625 相等的四进制数是( A.123.21 B.131.22

C.130.22

8.递归过程和函数调用时,处理参数和返回地址,通常使用一种称为( A.队列 B.多维数组 C.线性表 D.链表

9.TCP/IP 是一组构成互联网基础的网络协议,字面上包括两组协议:传输控制协议(TCP) 和网际互联协议 (IP) 。 TCP/IP 协议把 Internet 网络系统描述成具有 4 个层次功能的网络模型, 其中提供源节点和目的节点之间的信息传输服务,包括寻址和路由器选择等功能的是() 。 A.链路层 B.网络层 C.传输层 D.应用层 E.会话层 10.对有序数组{5,13,19,21,37,56,64,75,88,92,100} 进行二分查找,等概率情况下,查找成功的
49

平均查找长度(平均比较次数)是() 。 A.35/11 B.34/11 C.33/11

D.32/11

E.34/10

二、不定项选择题(共 10 题,每题 1.5 分,共计 15 分。每题正确答案的个数大于或等于 1。 多选或少选均不得分) 。 11.下列关于图灵的说法正确的有( ) 。 A.图灵奖是美国计算机协会与 1966 年设立的,专门鼓励那些对计算机做出重要贡献的个人 B.图灵奖有“计算机界诺贝尔奖”之称。 C.迄今为止,还没有华裔计算机科学家获此殊荣。 D.图灵奖的名称取自计算机科学先驱、英国科学家阿兰·图灵。 12.计算机在工作过程中,若突然停电, ( A.硬盘 B.CPU C. ROM )中不会丢失信息不会丢失。 D.RAM ) 。

13.若 A=True,B=False,C=True,D=False,以下逻辑运算表达式真的有( A. (A∧B)V( C∧DV?A) B. ( (?A∧ B)VC)∧?B C. (BVCVD) VD∧A D.A∧(DV?C)∧B

14.Web2.0 是近年来互联网热门概念之一,其核心是互动与分享。下列网站中, ( 典型的 Web2.0 的应用。 A.Sina B.Flickr C.Yahoo D.Google 15.(2008) 10+ (5B) 16 的结果是() 。 A. (833)16 B. (2099)10 C. (4063)8 D. (100001100011 )2

)是

16.二叉树 T,已知其先序遍历是 1 2 4 3 5 7 6(数字为节点编号,以下同) ,后序遍历是 4 2 7 5 6 3 1,则该二叉树的中根遍历是( ) A.4 2 1 7 5 3 6 B.2 4 1 7 5 3 6 C.4 2 1 7 5 6 4 D.2 4 1 5 7 3 6 17.面向对象的程序设计(Object-Oriented Programming)是一种程序设计的方法论,它将对 象作为程序设计的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性、 和扩展性。下面关于面向对象的程序设计说法中正确的是( ) 。 A.面向对象的程序设计方法通常采用自顶向下的设计方法进行设计。 B.面向对象的程序设计方法具有继承性( inheritance ) 、封装性( encapsulation ) 、多态性 (polymorphism)等几大特点。 C.支持面向对象特性称为面向对象的编程语言,目前较为流行的有 C++,JAVA, C#等。 D. 面向对象的程序设计的雏形来自于 Simula 语言, 后来在 SmallTalk 语言的完善和标准化的 过程中得到更多的扩展和对以前的思想的重新注解。至今,SmallTalk 语言仍然被视为面向对 象的基础。

50

18.设 T 是一棵有 n 个定点的树,以下说法正确的是( ) 。 A.T 是联通的,无环的 B.T 是联通的,有 n-1 条边 C.T 是无环的,有 n-1 条边 19.NOIP 竞赛推荐使用的语言环境有( A.Dev-C++ B. Visual C++ D.以上都不对 ) 。 C.Free Pascal ) 。 D.Lazarus

20.在下列防火墙(Firewall)的说法中,正确的有(

A.防火墙是一项协助确保信息安全的设备,其会依照特定的规则,允许或是限制数据通过 B.防火墙可能是一台专属硬件或是安装在一般硬件上的一套软件 C.网络层防火墙可以视为一种 IP 数据包过滤器,只允许符合特定规定的数据包通过,其余 的一概禁止穿越防火墙 D.应用层防火墙是在 TCP/IP 的“应用层”上工作,可以拦截进出某应用程序的所有数据包 三、问题求解(共 2 题,每题 5 分,共计 10 分) 1.有 6 个城市,任何两个城市之间有一条道路连接,6 个城市之间两两之间的距离如下表表 示,则城市 1 到城市 6 的最短距离为____________ 。 城市 1 城市 1 城市 2 城市 3 城市 4 城市 5 城市 6 0 2 3 1 12 15 城市 2 2 0 2 5 3 12 城市 3 3 2 0 3 6 5 城市 4 1 5 3 0 7 9 城市 5 12 3 6 7 0 2 城市 6 15 12 5 9 2 0

2.书架上有 21 本书,编号从 1 到 21 从中选 4 本,其中每两本的编号都不相邻的选法一 共有___________________ 种。 四、阅读程序写结果(共 4 题,每题 8 分,共计 32 分) 。 1.var i,a,b,c,d:integer; f:array[0..3] of integer; begin for i:=0 to 3 do read(f[i]); a:=f[0]+f[1]+f[2]+f[3]; a:=a div f[0]; b:=f[0]+f[2]+f[3]; c:=(b*f[1]+a) div f[2];

51

d:=f[(b div c) mod 4]; if (f[(a+b+c+d) mod 4]>f[2]) then begin a:=a+b; writeln(a) end else begin c:=c+d; writeln(c); end; end. 输入: 9 19 29 39

输出:_______________________________ 2.procedure foo(a,b,c:integer); begin if a>b then foo(c,a,b) else writeln(a,',',b,',',c) end; var a,b,c:integer; begin readln(a,b,c); foo(a,b,c); end. 输入:2 1 3 输出:_________________ 3.procedure f(a,b,c:integer); begin write(a,b,c,'/'); if (a=3)and(b=2)and(c=1) then exit; if (b<c) then f(a,c,b) else if a<b then if a<c then f(c,a,b) else f(b,c,a); end;
52

var a,b,c:integer; begin readln(a,b,c); f(a,b,c); end. 输入:1 3 2 输出:____________________ 4.var s:string; i,j,len,k:integer; begin readln(s); len:=length(s); for i:=1 to len do if (ord(s[i])>=ord('A')) and (ord(s[i])<=ord('Z')) then s:=chr(ord(s[i])-ord('A')+ord('a')); for i:=1 to len do if (ord(s[i])<ord('X')) then s:=chr(ord(s[i])+3) else s:=chr(ord(s[i])-23); write(s); write('/'); for j:=1 to 3 do begin i:=1; while i<=len-j do begin s[i]:=s[i+j]; i:=i+j; end; end; writeln(s); end. 输入:ABCDEFGuvwxyz 输出:________________________________ 五.完善程序(前 6 空,每空 3 分,后 5 空,每空 2 分,共 28 分) 。
53

1. ( 找 第 k 大 的 数) 给定 一 个长 度 为 1000000 的 无 序正 整数 序 列, 以 及另 一个 数 n(1<=n<=1000000) , 接下来以类似快速排序的方法找到序列中第 n 大的数 (关于第 n 大的数: 例如序列{1,2,3,4,5,6}中第 3 大的数是 4) Var a:array[1..1000000] of integer; n,m,ans:integer; procedure swap(var a,b:integer); var t:integer; begin if (a<>b) then begin t:=a; a:=b; b:=t; end; end; Function FindKth(left,right,n:integer):integer; Var tmp,value,i,j:integer; begin if left=right then exit(left); tmp:=random(right-left)+left; swap(a[tmp],a[left]); value:=____ ①_____ i:=left; j:=right; while i<j do begin while (i<j) and ( ________②______) do dec(j); if i<j then begin a[i]:=a[j];inc(i); end else break; while (i<j) and ( ___③___) do inc(i); if i<j then begin a[j]:=a[i]; dec(j); end else break; end; ____④_____ if i<n then begin inc(i); exit(FindKth(_____⑤_____));end; if i>n then begin dec(j); exit(______ ⑥________);end; exit(i); end; var i:integer; begin
54

randomize; ans:=-1; m:=5; for i:=1 to m do read(a[i]); read(n); ans:=FindKth(1,m,n); writeln(a[ans]); end. 2. (矩阵中的数字)有一个 n*n(1≤n≤5000)的矩阵 a,对于 1≤i<n, 1≤j≤n, a[i,j]<a[i+1,j] a[j,i]<a[j,i+1] 。即矩阵中左右相邻的两个元素,右边的元素一定比左边的大。上下相邻的两个 元素,下面的元素一定比上面的大。给定矩阵 a 中的一个数字 k,找出 k 所在的行列(注意: 输入数据保证矩阵中的数各不相同) 。 var n,k,answerx,answery:integer; a:array[1..5000,1..5000] of integer; Procedure FindKPosition; Var I,j:integer; Begin i:=n; j:=n; while j>0 do begin if a[n,j]<k then break; dec(j); end; ______①_________ while a[i, j]<>k do begin while (___②_____) and (i>1) do dec(i); while (___③_____) and (j<=n) do inc(j); end; _______④________ _______⑤________ end; var i,j:integer; begin read(n); for i:=1 to n do
55

for j:=1 to n do read(a[i,j]); read(k); FindKPosition; writeln(answerx,' ',answery); end.

第十三届(2007) 全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一、 单项选择题 (共 10 题, 每题 1.5 分, 共计 15 分。 每题有且仅有一个正确答案.) 。 1. 在以下各项中。 ( )不是 CPU 的组成部分。 A. 控制器 B. 运算器 C. 寄存器 D. 主板 2. 在关系数据库中, 存放在数据库中的数据的逻辑结构以( A. 二叉树 B. 多叉树 C. 哈希表 D. B+树 3.在下列各项中,只有( A. Byte B. KB ) 。 B. 美国信息交换标准代码 C. 数字的二进制数码 E. 常用字符的二进制编码 ) E.24 E. 算术逻辑单元(ALU) )为主。 E. 二维表

)不是计算机存储容量的常用单位。 C. MB D. UB E. TB

4.ASCII 码的含义是( A. 二—十进制转换码

D. 计算机可处理字符的唯一编码

5.在 Pascal 语言中,表达式 (23 or 2 xor 5)的值是( A. 18 B. 1 C.23 D.32

6.在 Pascal 语言中,判断整数 a 等于 0 或 b 等于 0 或 c 等于 0 的正确的条件表达式是 ( ) A. not ((a<>0) or (b<>0) or (c<>0)) B. not ((a<>0) and (b<>0) and (c<>0)) C. not ((a=0) and (b=0)) or (c=0) D.(a=0) and (b=0) and (c=0) E. not ((a=0) or (b=0) or (c=0))
56

7. 地面上有标号为 A、B、C 的 3 根细柱, 在 A 柱上放有 10 个直径相同中间有孔的圆盘, 从 上到下次依次编号为 1, 2, 3, ??,将 A 柱上的部分盘子经过 B 柱移入 C 柱, 也可以在 B 柱上暂存。如果 B 柱上的操作记录为: “进,进,出,进,进,出,出,进,进,出,进,出, 出” 。那么, 在 C 柱上, 从下到上的盘子的编号为( ) 。 A. 2 4 3 6 5 7 D. 2 4 3 6 7 5 B. 2 4 1 2 5 7 E. 2 1 4 3 7 5 ) 。 C. 21.73 C. 2 4 3 1 7 6

8. 与十进制数 17.5625 相对应的 8 进制数是( A. 21.5625 B. 21.44 D. 21.731

E. 前 4 个答案都不对

9. 欧拉图 G 是指可以构成一个闭回路的图, 且图 G 的每一条边恰好在这个闭回路上出现一次 (即一笔画成) 。在以下各个描述中, 不一定是欧拉图的是: ( ) 。 A. 图 G 中没有度为奇数的顶点 B. 包括欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径) C. 包括欧拉闭迹的图(欧拉迹是指通过途中每边恰好一次的路径) D. 存在一条回路, 通过每个顶点恰好一次 E. 本身为闭迹的图 10. 一个无 法靠自身 的控制 终止的循 环称为 “死循 环” ,例 如在 C 语言程 序中,语句 “while(1)printf("*"); ”就是一个死循环,运行它将无休止地打印*号。下面关于死循环的 说法中, 只有( )是正确的。 A. 不存在一种算法, 对任何一个程序及相应的输入数据, 都可以判断是否会出现死循环, 因而, 任何编译系统都不做死循环检查 B. 有些编译系统可以检测出死循环 C. 死循环属于语法错误, 既然编译系统能检查各种语法错误, 当然也能检查出死循环 D. 死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也是可以 检测的 E. 对于死循环,只能等到发生时做现场处理, 没有什么更积极的手段 二、 不定项选择题 (共 10 题,每题 1.5 分,共计 15 分。每题正确答案的个数大于或 等于 1。多选或少选均不得分) 。 11. 设 A=B=true,C=D=false,以下逻辑运算表达式值为真的有( ) 。 A. (﹁A∧B)∨(C∧D∨A) B. ﹁ ( ( (A∧B)∨C)∧D) C. A∧(B∨C∨D)∨D D. (A∧(D∨C)) ∧B

12. 命题“P→Q”可读做 P 蕴含 Q, 其中 P、Q 是两个独立的命题. 只有当命题 P 成立而命 题 Q 不成立时, 命题"P→Q"的值为 false, 其它情况均为 true. 与命题"P→Q"等价的逻辑 关系式是( ) 。
57

A. ﹁ P∨Q 13. A. C.

B. P∧Q ) 。 B. (208C)16 (20214)8

C. ﹁ (P∨Q)

D. ﹁(﹁Q∧P )

(2070)16 +(34)8 的结果是( (8332)10 (100000000110)2 D.

14. 已知 7 个节点的二叉树的先根遍历是 1 2 4 5 6 3 7(数字为结点的编号,以下同), 后 根遍历是 4 6 5 2 7 3 1, 则该二叉树的可能的中根遍历是( ) A. 4 2 6 5 1 7 3 C. 4 2 3 1 5 4 7 B. 4 2 5 6 1 3 7 D. 4 2 5 6 1 7 3

15. 冗余数据是指可以由其他数据导出的数据,例如,数据库中已存放了学生的数学、语文、 和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看做冗余数据。冗余数据往 往会造成数据的不一致,例如上面 4 个数据如果都是输入的,由于操作错误使总分不等于三 科成绩之和,就会产生矛盾。下面关于冗余数据的说法中, 正确的是( ) 。 A. 应该在数据库中消除一切冗余数据 B. 与用高级语言编写的数据处理系统相比, 用关系数据库编写的系统更容易消除冗余数据 C. 为了提高查询效率, 在数据库中可以适当保留一些冗余数据, 但更新时要做相容性检验 D. 做相容性检验会降低效率, 可以不理睬数据库中的冗余数据 16.在下列各软件中,属于 NOIP 竞赛(复赛)推荐使用的语言环境有( A. gcc B. g++ C. Turbo C D. free pascal ) 。 C. 显存 ) 。 D. RAM ) 。

17. 以下断电之后将仍能保存数据的有( A. 硬盘 B. ROM

18. 在下列关于计算机语言的说法中,正确的有(

A. 高级语言比汇编语言更高级, 是因为它的程序的运行效率更高 B. 随着 Pascal、C 等高级语言的出现, 机器语言和汇编语言已经退出了历史舞台 C. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上 D. C 是一种面向过程的高级计算机语言 19. 在下列关于算法复杂性的说法中, 正确的有( ) 。 A. 算法的时间复杂度,是指它在某台计算机上具体实现时的运行时间 B. 算法的时间复杂度,是指对于该算法的一种或几种主要的运算, 运算的次数与问题的规 模之间的函数关系 C. 一个问题如果是 NPC 类的, 就意味着在解决该问题时, 不存在一个具有多项式时间复杂 度的算法. 但这一点还没有得到理论上证实,也没有被否定 D. 一个问题如果是 NP 类的,与 C 有相同的结论
58

20. 近 20 年来, 许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力 的工具. 在下列关于递归的说法中, 正确的是( ) 。 A. 在 1977 年前后形成标准的计算机高级语言"FORTRAN77"禁止在程序使用递归, 原因之一 是该方法可能会占用更多的内存空间. B. 和非递归算法相比, 解决同一个问题, 递归算法一般运行得更快一些 C. 对于较复杂的问题, 用递归方式编程往往比非递归方式更容易一些 D. 对于已定义好的标准数学函数 sin(x), 应用程序中的语句“y=sin(sin(x));”就是一种 递归调用 三.问题求解(共 2 题,每题 5 分,共计 10 分) 1.给定 n 个有标号的球,标号依次为 1,2,?,n。将这 n 个球放入 r 个相同的盒子里,不 允许有空盒,其不同放置方法的总数记为 S(n,r)。例如,S(4,2)=7,这 7 种不同的放置方法 依次为{(1) , (234)} , {(2) , (134)} , {(3) , (124)} , {(4) , (123)} , {(12) , (34)} , {(13) , (24)} , {(14) , (23)}。当 n=7,r=4 时,S(7,4)= 。

2.N 个人在操场里围成一圈,将这 N 个人按顺时针方向从 1 到 N 编号,然后从第一个人起, 每隔一个人让下一个人离开操场,显然,第一轮过后,具有偶数编号的人都离开了操场。依 次做下去,直到操场只剩下一个人,记这个人的编号为 J(N),例如,J(5)=3,J(10)=5,等 等。 则 J(400)= 。 (提示:对 N=2m +r 进行分析,其中 0≤r<2m ) 。

四.阅读程序写结果(共 4 题,每题 8 分,共计 32 分) 1. program s401; var p,q:array[0..5] of integer; i,x,y:integer; begin y:=20; for i:=0 to 4 do read(p[i]); readln; q[0]:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7; q[1]:=p[0]+p[1] div ((p[2]+p[3]) div p[4]); q[2]:=p[0]*p[1] div p[2]; q[3]:=q[0]*q[1]; q[4]:=q[1]+q[2]+q[3]; x:=(q[0]+q[4]+2)-p[(q[3]+3) mod 4]; if (x>10) then y:=y+(q[1]*100-q[3]) div (p[p[4] mod 3]*5) else y:=y+20+(q[2]*100-q[3]) div (p[p[4] mod 3]*5);
59

writeln(x,',',y); end. /*注:本例中,给定的输入数据可以避免分母为 0 或下标越界。*/ 输入:6 6 5 5 3 输出: 2. program s402; var a,b:integer; x,y:^integer; procedure fun(a,b:integer); var k:integer; begin k:=a; a:=b; b:=k; end; begin a:=3; b:=6; x:=@a; y:=@b; fun(x^,y^); write('No.1:',a,',',b,' fun(a,b); writeln('No.2:',a,',',b); end. 输出: 3. program S403; var a1:array[1..50] of integer; var i,j,t,t2,n,n2:integer; begin n:=50; for i:=1 to n do a1[i]:=0; n2:=round(sqrt(n)); for i:=2 to n2 do if(a1[i]=0) then begin t2:=n div i; for j:=2 to t2 do a1[i*j]:=1; end; t:=0; for i:=2 to n do if (a1[i]=0) then
60

');

begin write(i:4); end; writeln; end. 输出:

inc(t);

if(t mod 10=0) then writeln;

4. program S404; const n=12; ch2:array[0..12] of char =('q','A','S','O','R','T','E','X','A','M','P','L','E'); var k:integer; ch:array[0..12] of char; procedure shift(k,n:integer); var v:char; j:integer; begin v:=ch[k]; j:=k+k; while (j<=n) do begin if (j<n) and (ord(ch[j])<ord(ch[j+1])) then inc(j); if (ord(v)<ord(ch[j])) then begin ch[j div 2]:=ch[j]; j:=j*2; end else exit; ch[j div 2]:=v; end; end; procedure hpsrt; var k:integer; tmp:char; begin for k:=n div 2 downto 1 do write('No.1: '); for k:=1 to n do writeln; begin
61

shift(k,n);

write(ch[k]);

for k:=n downto 1 do

tmp:=ch[1]; ch[1]:=ch[k]; ch[k]:=tmp; shift(1,k-1); end; end; begin for k:=0 to n do ch[k]:=ch2[k]; hpsrt; write('No.2: '); for k:=1 to n do write(ch[k]); writeln; end. 输出:

五.完善程序 (前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分) 1.(格雷码 Gray Code) Gray Code 是一种二进制编码,编码顺序与相应的十进制数的大小不一致。其特点是,对于 两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。另外,最大数与最小数间 也仅有一个二进制位不同,以 4 位二进制数为例,编码如下:

十进制数 0 1 2 3 4 5 6 7

格雷码 0000 0001 0011 0010 0110 0111 0101 0100

十进制数 格雷码 8 1100 9 1101 10 1111 11 1110 12 1010 13 1011 14 1001 15 1000

如果把每个二进制的位看做一个开关,则将一个数变为相邻的另一个数,只须改动一个开关。 因此,格雷码广泛用于信号处理、数-模转换等领域。 下面程序的任务是:由键盘输入二进制的位数 n(n<16),再输入一个十进制数 m(0≤m<2n ), 然后输出对应于 m 的格雷码(共 n 位,用数组 gr[ ]存放) program s501; var bound,m,n,i,j,b,p:integer; gr:array[0..14]of integer; begin bound:=1; writeln('input n,m'); readln(n,m); for i:=1 to n do bound:=[ ① ];
62

if (m<0)or(m>=bound) then begin writeln('Data error!'); [ ② end; ];

b:=1; for i:=1 to n do begin p:=0; b:=b*2; for[ ③ ] to m do if ([ ④ p:=1-p; gr[i]:=p; end; for i:=n[ ⑤ ] do write(gr[i]); writeln; end. 2. (连续邮资问题)某国发行了 n 种不同面值的邮票,并规定每封信上最多允许贴 m 张邮票。 在这些约束下, 为了能贴出{1, 2, 3, ?, maxvalue}连续整数集合的所有邮资, 并使 maxvalue 的值最大,应该如何设计各邮票的面值?例如,当 n=5 和 m=4 时,面值设计为(1,3,11,15, 32) ,可使 maxvalue 达到最大值 70(或者说,用这些面值的 1 至 4 张邮票可以表示不超过 70 的所有邮资,但无法表示邮资 71) 。而用其他面值的 1 至 4 张邮票如果可以表示不超过 k 的 所有邮资,必有 k≤70) 下面是用递归回溯求解连续邮资问题的程序。数组 x[1:n]表示 n 种不同的邮票面值, 并约定各元素按下标是严格递增的。数组 bestx[1:n]存放使 maxvalue 达到最大值的邮票面 值(最优解) ,数组 y[maxl]用于记录当前已选定的邮票面值 x[1:i]能贴出的各种邮资所需 的最少邮票张数。请将程序补充完整。 program S502; const NN=20; maxint=30000; maxl=500; var bestx,x:array [0..NN] of integer; y:array [0..maxl] of integer; j,n,m,maxvalue:integer; procedure result; var j:integer; begin writeln('max=',maxvalue);
63

] ) then

for j:=1 to n do writeln; end;

write(bestx[j]:4);

procedure backtrace(i,r:integer); var j,k:integer; z: array[0..maxl] of integer; begin for j:=0 to[ ① ]do if (y[j]<m) then for k:=1 to m-y[j] do if (y[j]+k<=y[ ② ]) then y[ ③ ]:=y[j]+k; while (y[r]<maxint) do inc(r); if (i>n) then begin if (r-1>maxvalue) then begin maxvalue:=[ ④ ] ; for j:=1 to n do bestx[j]:=x[j]; end; exit; end; for k:=0 to maxl do z[k]:=y[k]; for j:=[ ⑤ ] to r do begin x[i]:=j; [ ⑥ ]; for k:=0 to maxl do end; end; begin maxvalue:=0; writeln('input n,m:'); readln(n,m); for j:=1 to maxl do y[j]:=maxint; y[0]:=0; x[0]:=0; x[1]:=1; backtrace(2,1); result; end. y[k]:=z[k];

64

第十二届(2006) 全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 二小时完成 ) ●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●● 一、 单项选择题(共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案 .) 。 1. 在以下各项中。 ( )不是 CPU 的组成部分。 A. 控制器 B. 运算器 C. 寄存器 D. ALU E. RAM 2. BIOS (基本输入输出系统) 是一组固化在计算机内 ( A. 控制器 B. CPU C. 主板 D. 内存条 ) 上一个 ROM 芯片上的程序。 E. 硬盘

3.在下面各世界顶级的奖项中,为计算机科学与技术领域作出杰出贡献的科学家设立的奖项 是( ) 。 B. 诺贝尔奖 C. 菲尔兹奖 D. 图灵奖 E. 南丁格尔奖 A. 沃尔夫奖

4.在编程时(使用任一种高级语言,不一定是 Pascal),如果需要从磁盘文件中输入一个很 大的二维数组(例如 1000*1000 的 double 型数组) ,按行读(即外层循环是关于行的)与 按列读(即外层循环是关于列的)相比,在输入效率上( ) 。 A. 没有区别 C. 按行读的方式要高一些 B. 有一些区别,但机器处 理速度很快,可忽略不计 D. 按列读的方式要高一些 E.取决于数组的存储方式。

5.在 Pascal 语言中,表达式(21 xor 2)的值是( ) A. 441 B. 42 C.23 D.24 E.25 6.在 Pascal 语言中,判断 a 不等于 0 且 b 不等于 0 的正确的条件表达式是( A. not a=0 or not b=0 B. not((a=0)and(b=0)) C. not(a=0 and b=0) D. (a<>0)or(b<>0) E. (a<>0)and (b<>0) )

7.某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态 为空,从这一时刻开始的出入记录为:“进,出,进,进,进,出,出,进,进,进,出, 出”。假设车辆入站的顺序为 1,2,3,??,则车辆出站的顺序为( ) 。 A.1,2,3,4,5 B.1,2,4,5,7 C.1,4,3,7,6 D.1,4,3,7,2 E.1,4,3,7,5

8.高度为 n 的均衡的二叉树是指:如果去掉叶结点及相应的树枝,它应该是高度为 n-1 的 满二叉树。在这里,树高等于叶结点的最大深度,根结点的深度为 0,如果某个均衡的二叉 树共有 2381 个结点, 则该树的树高为( ) 。 A. 10 B. 11 C. 12 D. 13 E. 210 –1 9. 与十进制数 1770.625 对应的八进制数是(
65

) 。

A. 3352.5 D. 3350.1151

B. 3350.5 E. 前 4 个答案都不对

C. 3352.1161

10.将 5 个数的序列排序,不论原先的顺序如何,最少都可以通过( 小到大的排序。 A. 6 B. 7 C. 8 D. 9 E. 10

)次比较,完成从

二、 不定项选择题 (共 10 题, 每题 1.5 分, 共计 15 分。 每题正确答案的个数大于或等于 1。 多选或少选均不得分) 。 11. 设 A=B=D=true,C=E=false,以下逻辑运算表达式值为真的有( A. (┐A∧B)∨(C∧D)∨┐E C. A∧(B∨C∨D∨E) 12. B.?┐(((A∧B)∨C)∧D∧E) D. (A∧(B∨C))∧D∧E ) 。 C. (100000000110)2 D. (2042)16 ) 。

(2010)16 + (32)8 的结果是( B. (202A)16

A. (8234)10

13. 设栈 S 的初始状态为空,元素 a,b,c,d,e 依次入栈,以下出栈序列不可能出现的有 ( ) 。 A.a,b,c,e,d B.b,c,a,e,d C.a,e,c,b,d D.d,c,e,b,a

14. 已知 6 个结点的二叉树的先根遍历是 1 2 3 4 5 6(数字为结点的编号,以下同) ,后 根遍历是 3 2 5 6 4 1,则该二叉树的可能的中根遍历是( ) A. 3 2 1 4 6 5 B. 3 2 1 5 4 6 C. 2 3 1 5 4 6 D. 2 3 1 4 6 5 ) 。

15. 在下列各数据库系统软件中,以关系型数据库为主体结构的是( A. ACCESS B. SQL Server C. Oracle D. Foxpro

16.在下列各软件中,属于 NOIP 竞赛(复赛)推荐使用的语言环境有( A. gcc/g++ B. Turbo Pascal C. Turbo C ) 。 D. RAM ) 。 D. free pascal

) 。

17. 以下断电之后将不能保存数据的有( A. 硬盘 B. ROM C. 显存

18. 在下列关于计算机语言的说法中,正确的有( A. Pascal 和 C 都是编译执行的高级语言

B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上 C. C++是历史上的第一个支持面向对象的计算机语言 D. 高级语言比汇编语言更高级,是因为它的程序的运行效率更高 19. 在下列关于计算机算法的说法中,正确的有(
66

) 。

A. 一个正确的算法至少要有一个输入 B. 算法的改进,在很大程度上推动了计算机科学与技术的进步 C. 判断一个算法的好坏,主要依据它在某台计算机上具体实现时的运行时间 D. 目前仍然存在许多涉及到国计民生的重大课题, 还没有找到能够在计算机上实施的有效算 法 20. 在下列关于青少年信息学竞赛的说法中,你赞成的是( 题一律满分) 。 ) (本题不回答为 0 分,答

A.举行信息学竞赛的目的,是为了带动广大青少年学科学、爱科学,为造就一大批优秀的计 算机科学与技术人才奠定良好的基础 B. 如果竞赛优胜者不能直接保送上大学,我今后就不再参与这项活动了 C. 准备竞赛无非要靠题海战术,为了取得好成绩,就得拼时间、拼体力 D. 为了取得好成绩,不光要看智力因素,还要看非智力因素。优秀选手应该有坚韧不拔的意 志,有严谨求实的作风,既要努力奋进,又要胜不骄败不馁 三.问题求解(共 2 题,每题 5 分,共计 10 分) 1.将 2006 个人分成若干不相交的子集,每个子集至少有 3 个人,并且: (1)在每个子集中,没有人认识该子集的所有人。 (2)同一子集的任何 3 个人中,至少有 2 个人互不认识。 (3)对同一子集中任何 2 个不相识的人,在该子集中恰好只有 1 个人认识这两个人。 则 满足上述条件的子集最多能有 个? 2.将边长为 n 的正三角形每边 n 等分,过每个分点分别做另外两边的平行线,得到若干个 正三角形,我们称为小三角形。正三角形的一条通路是一条连续的折线,起点是最上面的一 个小三角形,终点是最 下面一行位于中间的小三角形。在通路中,只允许由一个小三角形走 到另一个与其有公共边的且位于同一行或下一行的小三角形,并且每个小三角形不能经过两 次或两次以上(图中是 n=5 时一条通路的例 子) 。设 n=10,则该正三角形的不同的通路的 总数为_ __。

四.阅读程序写结果(共 4 题,每题 8 分,共计 32 分)

67

1. Program ex401; var u,v:array[0..3] of integer; i,x,y:integer; begin x:=10; y:=10; for i:=0 to 3 do read(u[i]); v[0]:=(u[0]+u[1]+u[2]+u[3]) div 7; v[1]:=u[0] div ((u[1]-u[2]) div u[3]); v[2]:=u[0]*u[1] div u[2]*u[3]; v[3]:=v[0]*v[1]; x:=(v[0]+v[1]+2)-u[(v[3]+3) mod 4]; if (x>10) then y:=y+(v[2]*100-v[3]) div (u[u[0] mod 3]*5) 由 OIFans.cn 收集 else y:=y+20+(v[2]*100-v[3]) div (u[v[0] mod 3]*5); writeln (x,',',y); end. {*注:本例中,给定的输入数据可以避免分母为 0 或下标越界。} 输入:9 3 9 4 输出: 2.Program ex402; const m:array[0..4] of integer=(2,3,5,7,13); var i,j:integer; t: longint; begin for i:=0 to 4 do begin t:=1; for j:=1 to m[i]-1 do t:=t*2; t:=(t*2-1)*t; write (t,' '); end; writeln; end. 输出:_____

68

3. Program ex403; Const NN=7; Type Arr1=array[0..30] of char; Var s:arr1; k,p:integer; function fun1(s:arr1; a:char;n:integer):integer; var j:integer; begin j:=n; while (a<s[j])and(j>0) do dec(j); fun1:=j; end; Function fun2(s:arr1; a:char; n:integer):integer; var j:integer; begin j:=1; while (a>s[j])and(j<n) do inc(j); fun2:=j; end; begin for k:=1 to NN do s[k]:=chr(ord('A')+2*k+1); k:=fun1(s,'M',NN)+fun2(s,'M',NN); writeln(k); end. 输出: 4. program ex404; var x,x2:longint;由 OIFans.cn 收集 procedure digit(n,m:longint); var n2:integer; begin if(m>0) then begin n2:=n mod 10;
69

write(n2:2); if(m>1) then digit(n div 10,m div 10); n2:=n mod 10; write(n2:2); end; end; begin writeln('Input a number:'); readln(x); x2:=1; while(x2<x) do x2:=x2*10; x2:=x2 div 10; digit(x,x2); writeln; end. 输入:9734526 输出: 五.完善程序 (前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分) 1. (选 排 列) 下面 程 序的 功能 是 利用 递归 方 法生 成 从 1 到 n(n<10) 的 n 个 数中 取 k(1<=k<=n) 个数的 全部可能的排列(不一定按升序输出) 。例如,当 n=3,k=2 时,应该输 出(每行输出 5 个排列) : 12 13 21 23 32 31 程序: Program ex501; Var i,n,k:integer; a:array[1..10] of integer; count:longint; Procedure perm2(j:integer); var i,p,t:integer; begin if ① then begin for i:=k to n do begin inc(count); t:=a[k]; a[k]:=a[i]; a[i]:=t; for ② do write(a[p]:1); write(' ');
70

t:=a[k];a[k]:=a[i];a[i]:=t; if (count mod 5=0) then writeln; end; exit; end; for i:=j to n do begin t:=a[j];a[j]:=a[i];a[i]:=t; 由 OIFans.cn 收集 ③ ; t:=a[j]; end end; begin writeln('Entry n,k (k<=n):'); read(n,k); count:=0; for i:=1 to n do a[i]:=i; ⑤ ; end. 2. ( TSP 问题的交叉算子)TSP 问题(Traveling Salesman Problem) 描述如下:给定 n 个 城 市,构成一个完全图,任何两城市之间都有一个代价(例如路程、旅费等) ,现要构造遍 历所有城市的环 路,每个城市恰好经过一次,求使总代价达到最小的一条环路。 遗传算法是求解该问题的一个很有效的近似算法。在该算法中,一个个体为一条环路, 其编码方法 之一是 1 到 n 这 n 个数字的一个排列,每个数字为一个城市的编号。例如当 n=5 时, “3 4 2 1 5” 表示该方案实施的路线为 3->4->2->1->5->3。遗传算法的核心是通过 两个个体的交叉操作,产生两 个新的个体。下面的程序给出了最简单的一种交叉算法。具 体过程如下: (1)选定中间一段作为互换段,该段的起止下标为 t1,t2,随机生成 t1,t2 后,互换两段。 (2)互换后,在每个新的排列中可能有重复数字,因而不能作为新个体的编码,一般再做 两步处理: (2.1) 将两个互换段中,共同的数字标记为 0,表示已处理完。 (2.2) 将两个互换段中其余数字标记为 1,按顺序将互换段外重复的数字进行替换。例 如:n=12,两个个体分别是: a1: 1 3 5 4 * 2 6 7 9 * 10 12 8 11 a2: 3 2 1 12 * 6 7 10 11 * 8 5 4 9 t1=5,t2=8。上述每一行中,两个星号间的部分为互换段。假定数组的下标从 1 开始, 互换后有: a1: 1 3 5 4 * 6 7 10 11 * 10 12 8 11 a2: 3 2 1 12 * 2 6 7 9 * 8 5 4 9 然后,将数字 6,7 对应的项标记为 0,星号内数字 2,9,10,11 对应的项标记为 1,并 且按顺序对 应关系为:10<->2, 11<->9。 于是, 将 a1[9]=10 替换为 a1[9]=2, 将 a2[2]=2 替
71



;

换为 a2[2]=10, 类似再做第 2 组替换。这样处理后,就得到了两个新个体: a1: 1 3 5 4 6 7 10 11 2 12 8 9 a2: 3 10 1 12 2 6 7 9 (3)输出两个新个体的编码。 程序: 8 5 4 11

program ex502; type arr1=array[1..20] of integer; var a1,a2,kz1,kz2:arr1; n,k,t1,t2:integer; function rand1(k:integer):integer; var t:integer; begin t:=0; while (t<2) or(t>k) do t:=random(k+1)-2; rand1:=t; end; procedure read1(var a:arr1;m:integer); {读入数组元素 a[1]至 a[m],a[0]=0,略。} procedure wrt1(var a:arr1;m:integer); {输出数组元素 a[1]至 a[m],略。} procedure cross(var a1,a2:arr1;t1, t2,n:integer); 由 OIFans.cn 收集 var i,j,t,kj:integer; begin for i:=t1 to t2 do begin t:=a1[i]; end; for i:=1 to n do if (i<t1)or(i>t2) begin kz1[i]:=-1;kz2[i]:=-1; end else begin ② ; end; then ① ;

for i:=t1 to t2 do for j:=t1 to t2 do if(a1[i]=a2[j]) then
72

begin ③ for i:=t1 to t2 do if(kz1[i]=1) then

; break; end;

begin for j:=t1 to t2 do if(kz2[j]=1) then begin kj:=j; break; end; for j:=1 to n do if ④ then

if

begin a1[j]:=a2[kj];break; end; for j:=1 to n do ⑤ then begin a2[j]:=a1[i]; break; end; kz1[i]:=0;kz2[kj]:=0; end; end;

begin writeln('input (n>5):'); readln(n); writeln('input array 1:'); read1(a1,n); writeln('input array 2:'); read1(a2,n); t1:=rand1(n-1); repeat t2:=rand1(n-1); until(t1<>t2); if(t1>t2) then begin k:=t1; t1:=t2; t2:=k; end; ⑥ ; wrt1(a1,n); wrt1(a2,n); end.

73

第十一届(2005) 全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一、单项选择题(共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案.) 。 1. 字符串“ababacbab”和字符串“abcba”的最长公共子串是( ) 。 A. Abcba B. cba C. abc D. ab E. bcba 2. 设全集 I = {a, b, c, d, e, f, g, h},集合 A∪B= {a, b, c, d, e, f}, A∩C = {c, d, e}, A∩~ B= {a, d},那么集合 A∩B∩C 为( ) 。 A. {c, e} B. {d, e} C. {e} D. {c, d, e} E. {d, f}

3. 以下二进制数的值与十进制数 23.456 的值最接近的是( ) 。 A. 10111.0101 B. 11011.1111 C. 11011.0111 D. 10111.0111 E. 10111.1111

4. 完全二叉树的结点个数为 4 * N + 3,则它的叶结点个数为( ) 。 A. 2 * N B. 2 * N - 1 C. 2 * N + 1 D. 2 * N – 2 E. 2 * N + 2

5. 平面上有五个点 A(5, 3), B(3, 5), C(2, 1), D(3, 3), E(5, 1) 。以这五点作为完全图 G 的顶点,每两点之间的直线距离是图 G 中对应边的权值。图 G 的最小生成树中的所有边的 权值综合为( ) 。 A. 8 B. 7+ 5 C. 9 D. 6+ 5 E. 4+2 2 + 5

6. 下列设备中没有计算功能的是( ) 。 A. 笔记本电脑 B. 掌上电脑 C. 智能手机 7. Intel 的首颗 64 位处理器是( ) 。 A. 8088 B. 8086 C. 80386

D. 电子计算器

E. 液晶显示器

D. 80486

E. Pentium

8. 常见的邮件传输服务器使用( )协议发送邮件。 A. HTTP B. SMTP C. TCP D. FTP E. POP3

9. 不能在 Linux 上使用的网页浏览器是( ) 。 A. Internet Explore B. Netscape C. Opera D. Firefox E. Mozilla

10. 一位艺术史学家有 20000 幅 1024 * 768 的真彩色图像,如果将这些图像以位图形式保 存在 CD 光盘上(一张 CD 光盘的容量按 600M 计算) ,大约需要( )张 CD 光盘。 A. 1 B. 10 C. 100 D. 1000 E. 10000
74

二、不定项选择题(共 10 题,每题 1.5 分,共计 15 分。多选或少选均不得分) 。 11. 设 A = true,B = false,C = false,D = true,以下逻辑运算表达式值为真的有( ) 。 A. (A∧B)∨(C∧D) D. (A∧(B∨C))∨D B.((A∧B)∨C)∧D E. (A∨B)∧(C∨D) C. A∧((B∨C)∨D)

12. (3725)8 + (B)16 的运算结果是( ) 。 A. (3736)8 B. (2016)10 C. (11111100000)2

D. (3006)10

E. (7E0)16

13. 二叉树 T 的宽度优先遍历序列为 A B C D E F G H I,已知 A 是 C 的父结点,D 是 G 的 父结点,F 是 I 的父结点,树中所有结点的最大深度为 3(根结点深度设为 0) ,可知 E 的父 结点可能是( ) 。 A. A B. B C. C D. D E. F 14. 设栈 S 的初始状态为空,元素 a, b, c, d, e, f, g 依次入栈,以下出栈序列不可能出 现的有( ) 。 A. a, b, c, e, d, f, g B. b, c, a, f, e, g, d C. a, e, c, b, d, f, g D. d, c, f, e, b, a, g E. g, e, f, d, c, b, a

15. 下列外设接口中可以通过无线连接的方式连接设备的是( ) 。 A. USB 2.0 高速版 B. 红外 C. 蓝牙 D. 串口 E. IEEE 802.11g 无线网卡 16. 处理器 A 每秒处理的指令数是处理器 B 的 2 倍。某一特定程序 P 分别编译为处理器 A 和处理器 B 的指令,编译结果处理器 A 的指令数是处理器 B 的 4 倍。已知程序 P 的算法时 间复杂度为 O(n2 ),如果处理器 A 执行程序 P 时能在一小时内完成的输入规模为 n,则处理器 B 执行程序 P 时能在一小时内完成的输入规模为( ) 。 A. 4 * n B. 2 * n C. n D. n/2 E. n/4 17. 以下哪个(些)不是计算机的输出设备( ) 。 A. 鼠标 B. 显示器 C. 键盘 D. 扫描仪 E. 绘图仪

18. 以下断电之后将不能保存数据的有( ) 。 A. 硬盘 B. 寄存器 C. 显存 D. 内存 E. 高速缓存

19. 下列活动中属于信息学奥赛系列活动的是( ) 。 A. NOIP B. NOI C. IOI D. 冬令营 E. 国家队选拔赛

20. 下列关于高级语言的说法正确的有( ) 。 A. Ada 是历史上的第一个高级语言 B. Pascal 和 C 都是编译执行的高级语言
75

C. C++是历史上的第一个支持面向对象的语言 D. 编译器将高级语言程序转变为目标代码 E. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上 三.问题求解(请在空格处填上答案,每空 5 分,共计 10 分) 1. 将数组{32, 74, 25, 53, 28, 43, 86, 47}中的元素按从小到大的顺序排列,每次可以交 换任意两个元素,最少需要交换 次。 2. 取火柴游戏的规则如下:一堆火柴有 N 根,A、B 两人轮流取出。每人每次可以取 1 根或 2 根,最先没有火柴可取的人为败方,另一方为胜方。如果先取者有必胜策略则记为 1,先 取者没有必胜策略记为 0。当 N 分别为 100,200,300,400,500 时,先取者有无必胜策略 的标记顺序为 (回答应为一个由 0 和/或 1 组成的字符串) 。 四.阅读程序(共 4 题,每题 8 分,共计 32 分) 1. Var begin read(a, b, c); p := a div b div c; q := b - c + a + p; r[0] := a * p div q * q; r[1] := r[0] * (r[0] - 300); if (3 * q - p mod 3 <= r[0]) and (r[2] = r[2]) then r[1] := r[r[0] div p mod 2] else r[1] := q mod p; writeln(r[0] - r[1]); end. 输入:100 7 3 输出: 2. Var a : array [1..50] of integer; n, i, sum : integer; a, b, c, p, q : integer; r : array[0..2] of integer;

procedure work(p, r: integer); var i, j, temp : integer; begin if p < r then begin i := p - 1; for j := p to r - 1 do if a[j] >= a[r] then
76

begin inc(i); temp := a[i]; a[i] := a[j]; a[j] := temp; end; temp := a[i + 1]; a[i + 1] := a[r]; a[r] := temp; work(p, i); work(i + 2, r); end; end; begin read(n); for i := 1 to n do read(a[i]); work(1, n); for i := 1 to n - 1 do sum := sum + abs(a[i + 1] - a[i]); writeln(sum); end. 输入:10 23 435 12 345 3123 43 456 12 32 -100 输出: 3. Var str : string; len, i, j : integer; nchr : array [0..25] of integer; mmin : char; begin mmin := 'z'; readln(str); len := length(str); i := len; while i >= 2 do begin if str[i - 1] < str[i] then break; dec(i); end; if i = 1 then begin writeln('No result!'); exit; end; for j := 1 to i - 2 do write(str[j]); fillchar(nchr, sizeof(nchr), 0);
77

for j := i to len do begin if (str[j] > str[i - 1]) and (str[j] < mmin) then mmin := str[j]; inc(nchr[ord(str[j]) - ord('a')]); end; dec(nchr[ord(mmin) - ord('a')]); inc(nchr[ord(str[i - 1]) - ord('a')]); write(mmin); for i := 0 to 25 do for j := 1 to nchr[i] do write(chr(i + ord('a'))); writeln; end. 输入:zzyzcccbbbaaa 输出: 4. var n : longint; function g(k : longint) : longint; begin if k <= 1 then g := k else g := (2002 * g(k - 1) + 2003 * g(k - 2)) mod 2005; end; begin read(n); writeln(g(n)); end. 输入:2005 输出: 五.完善程序(前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分) 1.木材加工 题目描述: 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有 剩余) ,需要得到的小段的数目是给定的。当然,我们希望得到的小段越长越好,你的任务是 计算能够得到的小段木头的最大长度。 木头长度的单位是 cm。原木的长度都是正整数,我们要求切割得到的小段木头的长度 也是正整数。 输入: 第一行是两个正整数 N 和 K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N 是原木的数目,
78

K 是需要得到的小段的数目。 接下来的 N 行,每行有一个 1 到 10000 之间的正整数,表示一根原木的长度。 输出: 输出能够切割得到的小段的最大长度。如果连 1cm 长的小段都切不出来,输出”0”。 输入样例: 3 7 232 124 456 输出样例: 114 程序: var n, k : integer; len : array [1..10000] of integer; i, left, right, mid : integer; function isok(t : integer) : boolean; var num, i : integer; begin num := 0; for i := 1 to n do begin if num >= k then break; num := ① ; end; if ② then isok := true else isok := false; end; begin readln(n, k); right := 0; for i := 1 to n do begin readln(len[i]); if right < len[i] then right := len[i]; end; inc(right); ③ ; while ④ < right do begin mid := (left + right) div 2;
79

if ⑤ then right := mid else left := mid; end; writeln(left); end. 2.N 叉树 题目描述: 我们都了解二叉树的先根遍历,中根遍历和后根遍历。当知道先根遍历的结果和中根遍 历结果的时候,我们可以唯一的确定二叉树;同样的,如果知道了后根遍历的结果和中根遍 历结果,二叉树也是唯一确定的。但是如果只知道先根遍历和后根遍历的结果,二叉树就不 是唯一的了。但是我们可以计算满足条件的不同二叉树一共有多少个。这不是一个很困难的 问题,稍微复杂一点,我们把这个问题推广到 N 叉树。 我们用小写英文字母来表示 N 叉树的结点,不同的结点用不同的字母表示。比如,对 于 4 叉树,如果先根遍历的结果是 abdefgc,后根遍历的结果是 defgbca,那么我们可以 得到 6 个不同的 4 叉树(如下图) 。

输入: 输入数据包括 3 行。 第一行是一个正整数 N(2 ≤ N ≤ 20),表示我们要考虑 N 叉树。 第二行和第三行分别是两个字符串序列,分别表示先根遍历和后根遍历的结果。 输出: 输出不同的 N 叉树的数目。题目中给的数据保证得到的结果小于 231 。 输入样例: 4 abdefgc defgbca 输出样例: 6 程序: var str1, str2 : string;
80

N, len : integer; com : array[0..100, 0..100] of longint; function getcom(x, y : integer) : longint; begin if (y = 0) or (x = y) then ① else if com[x][y] <> 0 then getcom := com[x][y] else begin com[x][y] := getcom(x - 1, y)+ ② ; getcom := com[x][y]; end; end; function count(a, b, c : integer) : longint; var sum : longint; k, s, t, p : integer; begin sum := 1; k := 0; s := a + 1; t := c; if a = b then count := 1 else begin while s <= b do begin p := t; while str1[s] <> str2[t] do inc(t); sum := sum * count(s, s + t - p, p); s := ③ ; ④ ; inc(k); end; count := ⑤ * getcom(N, k); end; end; begin readln(N); readln(str1); readln(str2); len := length(str1); writeln(count( ⑥ )); end.

81

第十届(2004)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一、 单项选择题 (共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案.) 。 1. 设全集 I = {a, b, c, d, e, f, g} ,集合 A = {a, b, c} ,B = {b, d, e} ,C = {e, f, g} ,那么集合 。 ( A ? B) ? (~ C ? B) 为( ) A. {a, b, c, d} 2. B. {a, b, d, e} C. {b, d, e} D. {b, c, d, e} E. {d, f, g}

由 3 个 a,5 个 b 和 2 个 c 构成的所有字符串中,包含子串“abc ”的共有( )个。 A. 40320 B. 39600 C. 840 D. 780 E. 60

3.

某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状 态为空,从这一时刻开始的出入记录为: “进,出,进,进,出,进,进,进,出,出, 进,出” 。假设车辆入站的顺序为 1,2,3,??,则车辆出站的顺序为( ) 。 A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7 C. 1, 3, 5, 4, 6 D. 1, 3, 5, 6, 7 ) 。
N

E. 1, 3, 6, 5, 7

4.

满二叉树的叶结点个数为 N,则它的结点总数为( A. N B. 2 * N C. 2 * N – 1 D. 2 * N + 1

E. 2 – 1

5.

二叉树 T ,已知其前序遍历序列为 1 2 4 3 5 7 6,中序遍历序列为 4 2 1 5 7 3 6,则其后序 遍历序列为( ) 。 A. 4 2 5 7 6 3 1 B. 4 2 7 5 6 3 1 C. 4 2 7 5 3 6 1 D. 4 7 2 3 5 6 1 E. 4 5 2 6 3 7 1

6.

十进制数 100.625 等值于二进制数( ) 。 A. 1001100.101 B. 1100100.101 C. 1100100.011 D. 1001100.11 ) 。 E. 1001100.01

7.

下面哪个部件对于个人桌面电脑的正常运行不是必需的( A. CPU B. 图形卡(显卡) C. 光驱 D. 主板 ) 。

E. 内存

8.

下列哪个网络上常用的名字缩写是错误的( A. WWW(World Wide Web) B. URL( Uniform Resource Locator ) C. HTTP(Hypertext Transfer Protocol) D. FTP(Fast Transfer Protocol) E. TCP(Transfer Control Protocol) 。

9.

用静电吸附墨粉后转移到纸张上,是哪种输出设备的工作方式(
82

) 。

A. 针式打印机

B. 喷墨打印机 C. 激光打印机 D. 笔式绘图仪

E. 喷墨绘图仪

10. 一台计算机如果要利用电话线上网,就必须配置能够对数字信号和模拟信号进行相互转 换的设备,这种设备是( ) 。 A. 调制解调器 B. 路由器 C. 网卡 D. 网关 E. 网桥

二、 不定项选择题 (共 10 题,每题 1.5 分,共计 15 分。多选或少选均不得分) 。 11. 美籍匈牙利数学家冯·诺依曼对计算机科学发展所做出的贡献包括( ) 。 A. 提出理想计算机的数学模型,成为计算机科学的理论基础。 B. 提出存储程序工作原理,对现代电子计算机的发展产生深远影响。 C. 设计出第一台具有存储程序功能的计算机 EDVAC。 D. 采用集成电路作为计算机的主要功能部件。 E. 指出计算机性能将以每两年翻一番的速度向前发展。 12. 下列哪个(些)是 64 位处理器( A. Intel Itanium D. AMD Opteron ) 。 C. AMD Athlon64

B. Intel Pentium III E. IBM Power 5

13. (2004)10 + (32)16 的结果是( ) 。 A. (2036) 16 B. (2054) 10 C. (4006)8 D. (100000000110) 2 ) 。 D. Outlook ) 。 E. U 盘 E. Foxpro E. (2036)10

14. 下列哪个(些)不是数据库软件的名称( A. MySQL B. SQL Server C. Oracle

15. 下列哪个(些)不是计算机的存储设备( A. 文件管理器 B. 内存 C. 显卡

D. 硬盘 ) 。

16. 下列哪个(些)软件属于操作系统软件( A. Microsoft Word B. Windows XP

C. Foxmail

D. 金山影霸

E. Red Hat Linux

17. 下列说法中正确的有( ) 。 A. CPU 的基本功能就是执行指令。 B. CPU 的主频是指 CPU 在 1 秒内完成的指令周期数,主频越快的 CPU 速度一定越快。 C. 内部构造不同的 CPU 运行相同的机器语言程序,一定会产生不同的结果。 D. 在一台计算机内部,一个内存地址编码对应唯一的一个内存单元。 E. 数据总线的宽度决定了一次传递数据量的大小,是影响计算机性能的因素之一。 18. 彩色显示器所显示的五彩斑斓的色彩,是由哪三色混合而成的( A. 红 B. 白 C. 蓝 D. 绿 E. 橙 ) 。

83

19. 下列哪个(些)程序设计语言支持面向对象程序设计方法( A. C++ B. Object Pascal C. C D. Smalltalk E. Java 20. 某大学计算机专业的必修课及其先修课程如下表所示: 课程代号 C0 C1 C2 C3 C4 课程名称 先修课程 高等数学 程序设计语言 离散数学 C0 , C1 数据结构 C1 , C2 编译技术 C3 ) 。

) 。

C5 操作系统 C3 , C7

C6 普通物理 C0

C7 计算机原理 C6

请你判断下列课程安排方案哪个(些)是合理的( A. C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 C. C0 , C1 , C6 , C7 , C2 , C3 , C4 , C5 E. C0 , C1, C2, C3, C6, C7, C5, C4 三.问题求解(共 2 题,每题 5 分,共计 10 分) 1.

B. C0 , C1, C2, C3, C4, C6, C7, C5 D. C0, C1, C6, C7, C5, C2, C3, C4

75 名儿童到游乐场去玩。他们可以骑旋转木马,坐滑行铁道,乘宇宙飞船。已知其中 20 人这三种东西都玩过,55 人至少玩过其中的两种。若每样乘坐一次的费用是 5 元,游乐 场总共收入 700,可知有 名儿童没有玩过其中任何一种。 已知 a, b, c, d, e, f, g 七个人中,a 会讲英语;b 会讲英语和汉语;c 会讲英语、意大利语 和俄语;d 会讲汉语和日语;e 会讲意大利语和德语;f 会讲俄语、日语和法语;g 会讲 德语和法语。能否将他们的座位安排在圆桌旁,使得每个人都能与他身边的人交谈?如 果可以,请以“a b”开头写出你的安排方案: 。

2.

四.阅读程序(共 4 题,每题 8 分,共计 32 分) 1.program progam1; varu: array [0..3] of integer; a, b, c, x, y, z: integer; begin read(u[0], u[1], u[2], u[3]); a := u[0] + u[1] + u[2] + u[3] - 5; b := u[0] * (u[1] - u[2] div u[3] + 8); c := u[0] * u[1] div u[2] * u[3]; x := (a + b + 2) * 3 - u[(c + 3) mod 4]; y := (c * 100 - 13) div a div (u[b mod 3] * 5); if((x+y) mod 2 = 0) then z := (a + b + c + x + y) div 2; z := (a + b + c – x - y) * 2; writeln(x + y - z); end. 输入:2 5 7 4 输出: 。

84

2.program program2; var i, number, ndata, sum: integer; data: array[1..100] of integer; procedure solve(s, sign, n: integer); var i: integer; begin for i := s to ndata do begin inc(sum, sign * (number div (n * data[i]))); solve(i + 1, -sign, n * data[i]); end; end; begin read(number ,ndata); sum := 0; for i := 1 to ndata do read(data[i]); solve(1, 1, 1); writeln(sum); end. 输入:1000 3 5 13 11 3.program program3; var c: array[1..3] of string[200]; s: array[1..10] of integer; m, n, i: integer; procedure numara; var cod: boolean; i, j, nr: integer; begin for j := 1 to n do begin nr := 0; cod := true; for i := 1 to m do if c[i, j] = '1' then begin if not cod then begin cod := true; inc(s[nr]); nr := 0; end end else begin if cod then begin nr := 1; cod := false; end
85

输出:



else inc(nr); end; if not cod then inc(s[nr]); end; end; begin readln(m, n); for i := 1 to m do readln(c[i]); numara; for i := 1 to m do if s[i] <> 0 then write(i, ' ', s[i], ' '); end. 输入:3 10 1110000111 1100001111 1000000011 4.program program4; const u: array[0..2] of integer = (1, -3, 2); v: array[0..1] of integer = (-2, 3); vari, n, sum: integer; function g(n: integer): integer; var i, sum: integer; begin sum := 0; for i := 1 to n do inc(sum, u[i mod 3] * i); g := sum; end; begin sum := 0; read(n); for i := 1 to n do inc(sum, v[i mod 2] * g(i)); writeln(sum); end. 输入:103 输出: 。 输出: 。

五.完善程序 (前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分) 1.Joseph 题目描述:原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号 为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始
86

报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的 时候,出列的顺序依次是5,4,6,2,3,1。 现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。 我们希望求出m的最小值,使得最先出列的k个人都是坏人。 输入:仅有的一个数字是k(0 < k <14) 。 输出: 使得最先出列的k个人都是坏人的m的最小值。 输入样例: 4 输出样例: 30 程序: program program1; var i, k, m, start: longint; find: boolean; function check(remain: integer): boolean; var result: integer; begin result:=( if( ② ① ) mod remain;

)then begin

start := result; check := true; end else check := false; end; begin find := false; read(k); m := k; while ( ③ ) do begin

find := true; start := 0; for i := 0 to k-1 do if( not check( ④ find := false; break; end; inc(m); end; writeln( end. 2.逻辑游戏
87

)) then begin



);

题目描述:一个同学给了我一个逻辑游戏。他给了我图1,在这个图上,每一段边界都已经进 行了编号。我的任务是在图中画一条连续的曲线,使得这条曲线穿过每一个边界一次且仅穿 过一次,而且曲线的起点和终点都在这整个区域的外面。这条曲线是容许自交的。 对于图 1,我的同学告诉我画出这样的一条曲线(图 2)是不可能的,但是对于有的图形 (比如图 3) ,画出这样一条曲线是可行的。对于给定的一个图,我想知道是否可以画出满足 要求的曲线。

图1

图2

图3

图4

输入:输入的图形用一个n×n的矩阵表示的。矩阵的每一个单元里有一个0到255之间(包括0 和255)的整数。处于同一个区域的单元里的数相同,相邻区域的数不同(但是不相邻的区域 里的数可能相同) 。 输入的第一行是n(0<n<100) 。以下的n行每行包括n个整数,分别给出对应的单元里的整 数(这n个整数之间用空格分开) 。图4给出了输入样例对应的图形。 输出: 当可以画出满足题意的曲线的时候,输出“YES” ;否则,输出“NO” 。 输入样例: 3 112 122 112 输出样例: YES 程序: program program2; const d: array[0..7] of integer = (1, 0, -1, 0, 0, 1, var orig, n, i, j, ns: integer;
88



);

a: array[0..101, 0..101] of integer; bun: boolean; procedure plimba(x, y: integer); var i, x1, y1: integer; begin a[x, y] := -a[x, y]; if (abs(a[x - 1, y]) <> orig) and (( ② <> a[x - 1, y])

or (abs(a[x, y - 1]) <> orig)) then inc(ns); if (abs(a[x + 1, y]) <> orig) and ((a[x + 1, y - 1] <> a[x + 1,y]) or (abs(a[x, y - 1]) <> orig)) then inc(ns); if (abs(a[x, y - 1]) <> orig) and (( ③ <> a[x, y - 1]) or (abs(a[x - 1, y]) <> orig)) then inc(ns); if (abs(a[x, y + 1]) <> orig) and ((a[x - 1, y + 1] <> a[x,y + 1]) or (abs(a[x - 1, y]) <> orig)) then inc(ns); for i := 0 to 3 do begin x1 := x + d[2 * i];y1:=y+ ④ ;

if (x1 >= 1) and (x1 <= n) and (y1 >= 1) and (y1 <= n) and ( ⑤ ) then plimba(x1, y1); end; end; begin bun := true; read(n); for i := 0 to n+1 do for j := 0 to n+1 do a[i, j] := 0; a[0, 0] := -1; a[n + 1, 0] := -1; a[0, n + 1] := -1; a[n + 1, n + 1] := -1; for i := 1 to n do for j := 1 to n do read(a[i, j]); for i := 1 to n do for j := 1 to n do if a[i, j] > -1 then begin ns := 0; ⑥ ; plimba(i, j); if ns mod 2 = 1 then bun := false; end; if bun then writeln('YES'); if not bun then writeln('NO'); end.

89

第九届(2003)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一.单选题(共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案) 。 1.图灵(Alan Turing)是( ) 。 A)美国人 B)英国人 C)德国人 D)匈牙利人 E)法国人 2.第一个给计算机写程序的人是( A) Alan Mathison Turing D)John Mc-Carthy ) 。

B)Ada Lovelace C)John von Neumann E)Edsger Wybe-Dijkstra ) 。 D)11111010011 E)1111010011 ) 。

3.十进制数 2003 等值于二进制数( A)0100000111 B)10000011

C)110000111

4.假设 A=true, B=false,C=true,D=true,逻辑运算表达式 A∧ B∨C∧D 的值是( A)true B)false C)0 D) 1 E)NULL ) 。 E)2 -1
h

5.一个高度为 h 的二叉树最小元素数目是( A)2h+1 B)h C)2h-1 D)2h

6.已知队列(13,2,11,34,41,77,5,7,18,26,15),第一个进入队列的元素为 13, 则第五个出队列的元素是( ) 。 A)5 B)41 C)77 D)13 E)18

7.下面一段程序是用( int func1(int n){ int i,sum=0; for (i=1;i<=n;i++) sum+=i*i; return sum; } A)FORTRAN

)语言书写的。

B)PASCAL

C)C

D)PROLOG

E)BASIC

8.设全集 E={1,2,3,4,5},集合 A={1,4},B={1,2,5},C={2,4},则集合(A∩B) ∪~C 为( ) 。 A)空集 B){1} C){3,5} D){1,5} E){1,3,5} 9.表达式(1+35)*5-56/7 的后缀表达式为(
90

) 。

A)1+34*5-56/7 D)1 34 5 *+56 7 /-

B)-*+1 34 5 / 56 7 E)1 34 +5 56 7 - * /

C)1 34 + 5 * 56 7 /-

10.下列计算机设备,既是输入设备,又是输出设备的是( ) 。 A)键盘 B)触摸屏 C)扫描仪 D)投影仪 E)数字化仪 二.不定项选择题(共 10 题,每题 1.5 分,共计 15 分。多选或少选均不得分) 。 11.下列分辨率的显示器所显示出的图像,最清晰的是( ) 。 A)800*600 B)1024*768 C)640*480 D)1280*1024 E)800*1000

12.下列说法中,哪个(些)是错误的( ) 。 A)程序是指令的序列,它有三种结构:顺序、分支和循环。 B)数据总线决定了中央处理器 CPU 所能访问的最大内存空间的大小。 C)中央处理器 CPU 内部有寄存器组,用来存储数据。 D)不同厂家生产的 CPU 所能处理的指令集是相同的。 E)数据传输过程中可能会出错,奇偶校验法可以检测出数据中那一位在传输中出了差错。 13.CPU 访问内存的速度比访问下列哪个(些)存储设备要慢( ) 。 A)寄存器 B)硬盘 C)软盘 D)高速缓存 E)光盘 14.下列电子邮件地址,哪个(些)是正确的( ) 。 A)wang@hotmail.com B)cai@jcc.pc.tool.rf.edu.jp C)162.105.111.22 D)ccf.edu.cn E)http://www.sina.com ) E)Midisoft

15.数字图像文件可以用下列哪个(些)软件来编辑(

A)画笔(Paintbrush) B)记事簿(Notepad) C)Photoshop D)WinRAR 16.下列哪个(些)软件不是操作系统软件的名字( A) Windows XP B)DOS C)Linux D)OS/2 ) 。 E)Arch/Info

17.下列哪个(些)不是个人计算机的硬件组成部分( ) 。 A)主板 B)虚拟内存 C)电源 D)硬盘 E)总线 18.运算式(2008)10 -(3723)8 的结果是( A) (-1715)10 B) (5)10 C) (5)16 ) 。 D) (101)2

E) (3263)8

19.已知元素(8,25,14,87,51,90,6,19,20) ,问这些元素以怎样的顺序进入栈,才 能使出栈的顺序满足:8 在 51 前面;90 在 87 后面;20 在 14 后面;25 在 6 前面;19 在 90 后面。 ( ) A)20,6,8,51,90,25,14,19,87
91

B)51,6,19,20,14,8,87,90,25 C)19,20,90,8,6,25,51,14,87 D)6,25,51,8,20,19,90,87,14 E)25,6,8,51,87,90,19,14,20 20.假设我们用 d=(a1 ,a2 ,…,a5 ) ,表示无向图 G 的 5 个顶点的度数,下面给出的哪(些) 组 d 值合理的( ) 。 A){5,4,4,3,1} B){4,2,2,1,1} C){3,3,3,2,2} D){5,4,3,2,1} E){2,2,2,2,2}

三.问题求解(共 2 题,每题 5 分,共 10 分) 1.无向图 G 有 16 条边,有 3 个 4 度顶点、4 个 3 度顶点,其余顶点的度均小于 3,则 G 至 少 个顶点。 2.某年级学生共选修 6 门课程,期末考试前,必须提前将这 6 门课程考完,每人每天只在下 午至多考一门课程,设 6 门课程分别为 c 1 ,c 2 ,c 3 ,c4 ,c5 ,c6 ,S(ci )为学习 ci 的学生集合。 已知 S(c i)∩S(c 6)≠φ ,i=1,2, …,5,S(ci )∩S(ci+1 ) ≠φ ,i=1,2,3,4,S(c 5 )∩S(c 1 )≠φ ,问至少安 排 天才能考完这 6 门课程。

四、阅读程序(共 4 题,每题 8 分,共计 32 分) 1.Program program1; var a,b,c,d,sum:longint; begin read(a,b,c,d) ; a:=a mod 23; b:=b mod 28; c:=c mod 33; sum:=a*5544+b*14421+c*1288-d; sum:=sum+21252; sum:=sum mod 21252; if end. 输入:283 2.Program (sum=0) then sum:=21252; writeln(sum); 102 23 320 program2; integer=(0,5,3,1); 输出:

const u: array[1..4]of

v: array[1..4]of integer=(0,7,6,5); var a,b,c,d,e,f,x,y,z:integer; begin read(a,b,c,d,e,f); z:=f+e+d+(c+3) div 4; y:=5*d+u[c mod 4];
92

if (b>y) then begin z:=z+(b-y+8) div 9; x:=((b-y+8) div 9*9-(b-y))*4+11*e+v[c mod 4]; end else x:=(y-b)*4+11*e+v[c mod 4]; if (a>x) then z:=z+(a-x+35) div 36; writeln(z); end. 输入:4 7 9 20 56 47 program3; 输出:

3.Program

var m,n: integer; mark:boolean; function test(m,n: integer): integer; var i,p:integer; flag:boolean; begin m:=m-1; for p:=2*n begin i:=(i+m) i:=0; flag:=false; do downto (n+1) mod p;

if (i<N) then begin test:=0; end end; if end; begin read(n); repeat if m:=1; mark:=false; then break; end; not(flag) then test:=1; flag:=true; break;

(test(m,n)=1)

begin writeln(m); m:=m+1; until end. 输入:7 4.Program mark; 输出: program4;

93

var m,n,i,j: integer; p,w,a,b: array[0..19] of begin read(n); m:=0; for i:=0 to n-1 do

integer;

begin read(p[i]); b[i]:=1; for i:=0 to n-1 do begin if (i>0) else then

end;

a[m]:=p[i]-p[i-1]

a[m]:=p[i];

m:=m+1; while ((m>1) and (a[m-1]=0)) do begin m:=m-1; b[m]:=1; end; if (m>0) then w[i]:=b[m-1] else w[i]:=b[0]; a[m-1]:=a[m-1]-1; for j:=0 to m-1 do while begin m:=m-1; end; end; for i:=0 to n-1 do begin write(w[i]); write( ‘ end; writeln( ‘ end. 输入:9 4 6 6 6 6 8 9 9 9 输出: 五.完善程序(共 2 题,第 1 题每空 3 分;第 2 题每题 2 分。共 28 分) 1.翻硬币 题目描述:一摞硬币共有 m 枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后 放回原处。 然后取下最上面的 2 枚硬币, 将他们一起翻面后再放回原处。 再取 3 枚, 取 4 枚…… 直至 m 枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直下去,直到这 螺硬币中的每一枚又都是正面朝上为止。例如,m 为 1 时,翻两次即可。 输入:仅有的一个数字是这螺硬币的枚数 m,0<m<1000。 输出:为了使这螺硬币中的每一枚又都是正面朝上所必需翻的次数。
94

b[j]:=b[j]+1; do

((m>1) and (a[m-1]=0)) b[m]:=1;

‘);

‘);

输入样例:30 输出样例:899 程序: program Program1; var m: integer; function solve(m: integer): integer; var i,t,d: integer; flag:boolean; begin if (m=1) then solve:=( 1 ) else begin d:=2*m+1; t:=2; repeat if (t=1) then begin solve:=( End else if ( begin solve:=i*m-1; end; else t:=( i:=i+1; until flag; end; end; begin read(m); if (( 5 writeln( end. 2.OIM 地形 题目描述:二维离散世界有一种地形叫 OIM(OI Mountain) 。这种山的坡度只能上升( ‘/’ ) 或下降( ‘\ ’ ) ,而且两边的山脚都与地平线等高,山上所有地方都不低于地平线。例如: /\ / \/ \ 是一座 OIM;而/ /\ \ \/
95

i:=1;

flag:=false;

2 3

); ) then

flag:=true;

flag:=true;

4

);

) and (m<1000)) 6 );

then

不是。

这个世界的地理学家们为了方便记录, 给 OIM 所有可能的形状用正整数编好号, 而且每 个正整数恰好对应一种山形。他们规定,若两座上的宽度不同,则较宽的编号较大;若宽度 相同,则比较从左边开始第 1 个坡度不同的地方,坡度上升的编号较大。以下三座 OIM 的编 号由小到大递增: /\ / \/ \ / \ / \/ \ / \/ \ 。显然 / \ 的编号为 1。但是地理学家在整理记录时发觉, 查找编号与山形的对应关系不是很方便。他们希望能快速地从编号得到山的形状。你自告奋 勇答应给他们写一个程序,输入编号,能马上输出山形。 输入:一个编号(编号大小不超过 600,000,000) , 输出:输入编号所对应的山形,1 座山所占行数恰为它的高度,即山顶上不能有多余空行。 输入样例:15 输出样例: /\ /\ / \/ \ 程序: program Program2; const L:integer=19; SZ:integer=50; UP:char='/'; var i,nth,x,y,h,e,f:integer; m:array [0..1,0..38,0..19] of integer; pic:array [0..49,0..49] of char; procedure init; var k,s,a,b,c:integer; begin for a:=0 to 1 do for b:=0 to 2*L do for c:=0 to L do m[a,b,c]:=0; m[0,0,0]:=1; for k:=0 to 2*L-1 do begin for s:=1 to L do begin m[0,k+1,s]:=m[0,k,s+1]+m[1,k,s+1]; m[1,k+1,s]:=( 1 ); end; m[0,k+1,0]:=m[0,k,1]+m[1,k,1]; end;
96

/\

/\

/\

DN:char= '\';

end; procedure draw(k,s,nth:integer); begin if (k=0) then exit; if ((nth-m[1,k,s])>=0) then begin nth:=nth-m[1,k,s]; if (y>h) then pic[y,x]:=UP; end else begin y:=y-1; end; end; begin init; read (nth); for e:=0 to SZ-1 do for f:=0 to SZ-1 do pic[e,f]:=' x:=0; y:=0; h:=0; i:=0; while ((nth-m[0,2*i,0]>=0) do begin nth:=nth-m[0,2*i,0]; ( end; draw( 5 ); for i:=h downto 0 do begin for e:=0 to x-1 do write (pic[i,e]); writeln (' '); end; end. 4 ); '; ( 2 y:=y+1; ); x:=x+1; draw( 3 );

pic[y,x]:=DN;

x:=x+1;

draw(k-1,s-1,nth);

97

第八届(2002)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一. 选择一个正确答案代码,填入每题的括号内(每题 1.5 分,多选无分,共 30 分) 1. 微型计算机的问世是由于( )的出现。 A)中小规模集成电路 B)晶体管电路 C) (超)大规模集成电路 D)电子管电路 2. 中央处理器(CPU)能访问的最大存储器容量取决于( A)地址总线 B)数据总线 C)控制总线 ) 。

D)实际内存容量 ) 。 D)0.0001011

3. 十进制书 11/128 可用二进制数码序列表示为: ( A)1011/1000000 B)1011/100000000

C)0.001011

4. 算式(2047)10 -(3FF)16 +(2000)8 的结果是( ) 。 A) (2048)10 B) (2049)10 C) (3746)8 D) (1AF7)16 5. 已知 x =(0.1011010)2 ,则[ x / 2 ] 补 =( A)0.1011101 B)11110110 )2 。

C)0.0101101 D)0.100110

6. IPv4 地址是由( A)16 B)32

)位二进制数码表示的。 C)24 D)8

7. 计算机病毒传染的必要条件是: ( ) 。 A)在内存中运行病毒程序 C)在内存中运行含有病毒的可执行的程序 B)对磁盘进行读写操作 D)复制文件

8. 在磁盘上建立子目录有许多优点,下列描述中不属于建立子目录优点的是( ) 。 A)便于文件管理 C)加快文件查找速度 B)解决根目录中目录项个数有限问题 D)节省磁盘使用空间

9. 在使用 E-mail 前,需要对 Outlook 进行设置,其中 ISP 接收电子邮件的服务器称为( ) 服务器。 A)POP3 B)SMTP C)DNS D)FTP

10.多媒体计算机是指( A)专供家庭使用的

)计算机。 B)装有 CD-ROM 的 D)具有处理文字、图形、声音、影像等信息的

C)连接在网络上的高级

98

11.微型计算机中, ( )的存取速度最快。 A)高速缓存 B)外存储器 C)寄存器

D)内存储器

12.资源管理器的目录前图标中增加“+”号,这个符号的意思是( ) 。 A)该目录下的子目录已经展开 B)该目录下还有子目录未展开 C)该目录下没有子目录 D)该目录为空目录 ) 。

13.在 WORD 文档编辑中实现图文混合排版时,关于文本框的下列叙述正确的是(

A)文本框中的图形没有办法和文档中输入文字叠加在一起,只能在文档的不同位置 B)文本框中的图形不可以衬于文档中输入的文字的下方 C)通过文本框,可以实现图形和文档中输入的文字的叠加,也可以实现文字环绕 D)将图形放入文本框后,文档中输入的文字不能环绕图形 14. 一个向量第一个元素的存储地址是 100, 每个元素的长度是 2, 则地 5 个元素的地址是 ( A) 110 B)108 C)100 D)109 ) 。 ) 。

15.已知 A = 35H, A /\ 05H \/ A /\ 30H 的结果是: ( A)30H B)05H C)35H D)53H

16. 设有一个含有 13 个元素的 Hash 表 (0 ~ 12) , Hash 函数是:H (key) = key % 13, , 其中% 是求余数运算。用线性探查法解决冲突,则对于序列(2、8、31、20、19、18、53、27) , 18 应放在第( )号格中。 A)5 B)9 C)4 D)0

17.按照二叉数的定义,具有 3 个结点的二叉树有( )种。 A)3 B)4 C)5 D)6 )倍。

18.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( A)1/2 B)1 C)2 D)4

19.要使 1 . . .8 号格字的访问顺序为:8、2、6、5、7、3、1、4,则下图中的空格中应填 入( ) 。 1 4 A)6 B)0 C)5 2 6 D)3 3 1 4 -1 5 7 6 7 3 8 2

20.设栈 S 和队列 Q 的初始状态为空,元素 e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6 依次通过栈 S,一 个元素出栈后即进入队列 Q,若出队的顺序为 e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈 S 的 容量至少应该为( ) 。

99

A)2

B)3

C)4 D)5

二.问题求解: ( 6 + 8 = 14 分) 1. 在书架上放有编号为 1 ,2 , . . . ,n 的 n 本书。现将 n 本书全部取下然后再放回去,当 放回去时要求每本书都不能放在原来的位置上。例如:n = 3 时: 原来位置为:1 2 3 放回去时只能为:3 1 2 或 2 3 1 这两种 问题:求当 n = 5 时满足以上条件的放法共有多少种?(不用列出每种放法) 2. 设有一棵 k 叉树,其中只有度为 0 和 k 两种结点,设 n 0 ,n k ,分别表示度为 0 和度为 k 的结点个数,试求出 n 0 和 n k 之间的关系(n 0 = 数学表达式,数学表达式仅含 n k 、 k 和数字) 。 三.阅读程序,写出正确的程序运行结果: ( 8 + 9 + 9 = 26 分) 1. program Gxp1; var i , n , jr , jw , jb : integer ; ch1 : char ; ch begin readln(n); for i:=1 to n do read(ch[i]); jr:=1; jw:=n; jb:=n; while (jr<=jw) do begin if (ch[jw]=’R’) then begin ch1:=ch[jr]; ch[jr]:=ch[jw]; ch[jw]:=ch1; jr:=jr+1; end else if ch[jw]=’W’ then jw:=jw-1; else begin ch1:=ch[jw]; ch[jw]:=ch[jb]; ch[jb]:=ch1; jw:=jw -1; jb:=jb-1; end end; for i:=1 to n do write(ch[1]); writeln; end. 输入:10 RBRBWWRBBR 输出:
100

: array[1..20] of char ;

2. program Gxp2; var i , j , s ,sp1 : integer ; p a : boolean ; : array[1..10] of integer ;

begin sp1:=1; a[1]:=2; j:=2; while sp1<10 do begin j:=j+1; p:=true; for i:=2 to j-1 do if (j mod i=0) then p:=false; if p then begin sp1:=sp1+1; a[sp1]:=j; end; end; j:=2; p:=true; while p do begin s:=1; for i:=1 to j do s:=s*a[i]; s:=s+1; for i:=2 to s-1 do if s mod i=0 then p:=false; j:=j+1; end; writeln(s); writeln; end. 输出: 3. Program Gxp2 V ar d1 , d2 , X , Min : real ; begin Min:=10000; X:=3; while X<15 do begin d1:=sqrt(9+(X-3)*(X-3)); d2:=sqrt(36+(15-X)*(15-X)); if(d1+d2)<Min then Min:=d1+d2; X:=x+0.001; end;
101

writeln(Min:10:2); end. 输出: 四.完善程序: ( 15 + 15 = 30 分) 1. 问题描述:工厂在每天的生产中,需要一定数量的零件,同时也可以知道每天生产一个 零件的生产单价。在 N 天的生产中,当天生产的零件可以满足当天的需要, 若当天用不完,可以放到下一天去使用,但要收取每个零件的保管费,不同 的天收取的费用也不相同。 问题求解:求得一个 N 天的生产计划(即 N 天中每天应生产零件个数) ,使总的费用最 少。 输入:N(天数 N<=29) 每天的需求量(N 个整数) 每天生产零件的单价(N 个整数) 每天保管零件的单价(N 个整数) 输出:每天的生产零件个数(N 个整数) 例如:当 N=3 时,其需要量与费用如下: 第一天 需 要 量 生产单价 保管单价 25 20 第二天 15 30 第三天 30 32 0 总的费用 25*20+15*30+30*32=1910 40*20+15*5+30*32=1835 70*20+45*5+30*10=1925

5 10 生产计划的安排可以有许多方案,如下面的三种: 第一天 25 40 70 程序说明: b[n]:存放每天的需求量 c[n]:每天生产零件的单价 d[n]:每天保管零件的单价 e[n]:生产计划 程序: program exp5; var i,j,n,yu,j0,j1,s : integer ; b,c,d,e begin readln(n); for i:=1 to n do readln(b[i],c[i],d[i]); : array[0..30] of integer ; 第二天 15 0 0 第三天 30 30 0

102

for i:=1 to n do e[i]:=0; ①__________:=10000; while (j0<=n) do

c[n+2]=0;

b[n+1]:=0

j0:=1;

begin yu:=c[j0]; j1:=j0; s:=b[j0]; while ②__________ do begin ③__________ j1:=j1+1; end; ④__________ j0:=j1+1; end; for i:=1 to n do ⑤__________ readln; end. 2.问题描述:有 n 种基本物质(n≤10) ,分别记为 P1,P2 ,??,Pn,用 n 种基本物质构造 物质,这些物品使用在 k 个不同地区(k≤20) ,每个地区对物品提出自己的 要求,这些要求用一个 n 位的数表示:a1 a2 ??a n ,其中: ai = 1 表示所需物质中必须有第 i 种基本物质 = -1 表示所需物质中必须不能有第 i 种基本物质 = 0 无所谓 问题求解:当 k 个不同要求给出之后,给出一种方案,指出哪些物质被使用,哪些物质 不被使用。 程序说明:数组 b[1],b[2]……b[n] a[1..k,1..n] a[i,j]=1 a[i,j]=0 a[i,j]= -1 程序: program gxp2; var i,j,k,n : integer ; p b a : boolean ; : array[0..20] of 0..1 ; : array[1..20,1..10] of integer ; 表示某种物质 记录 k 个地区对物品的要求,其中: 表示第 i 个地区对第 j 种物品是需要的 表示第 i 个地区对第 j 种物品是无所谓的 表示第 i 个地区对第 j 种物品是不需要的 s:=s+b[j1];

begin readln(n,k); for i:=1 to k do begin for j:=1 to n do read(a[i,j]);
103

readln; end; for i:=0 to n do b[i]:=0; p:=true; while ①__________ do begin j:=n; while b[j]=1 do j:=j-1; ②__________ for i:=j+1 to n do b[i]:=0; ③__________ for i:=1 to k do for j:=1 to n do if (a[i,j]=1) and (b[j]=0) or ④__________ then p:=true; end; if ⑤__________ then writeln(‘ 找不到!’) else for i:=1 to n do if (b[i]=1) then writeln(‘ 物质’,i,’需要’) else writeln(‘ 物质’,i,’不需要’); end.

104

第七届(2001)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一. 选择一个正确答案代码( A/B/C/D) ,填入每题的括号内(每题 1.5 分,多选无分,共 30 分) 1.中央处理器 CPU 能访问的最大存储器容量取决于( ) A)地址总线 B)数据总线 C)控制总线 D)内存容量

2.计算机软件保护法是用来保护软件( )的。 A)编写权 B)复制权 C)使用权

D)著作权 )

3.64KB 的存储器用十六进制表示,它的最大的地址码是( A)10000 B)FFFF C)1FFFF

D)EFFFF )

4.在树型目录结构中,不允许两个文件名相同主要指的是( A)同一个磁盘的不同目录下 C)不同磁盘的不同目录下

B)不同磁盘的同一个目录下 D)同一个磁盘的同一个目录下

5.下列设备哪一项不是计算机输入设备( ) A)鼠标 B)扫描仪 C)数字化仪 6.在计算机硬件系统中,cache 是( A)只读 B)可编程只读 )存储器

D)绘图仪

C)可擦除可编程只读

D)高速缓冲 )

7.若我们说一个微机的 CPU 是用的 PII300,此处的 300 确切指的是( A)CPU 的主时钟频率 C)每秒执行 300 百万条指令 8.E—mail 邮件本质上是一个( A)文件 B)电报 ) C)电话 D)传真 B)CPU 产品的系列号 D)此种 CPU 允许最大内存容量

9.2KB 的内存能存储( )个汉字的机内码 A)1024 B)516 C)2048 10.以下对 Windows 的叙述中,正确的是( ) A)从软盘上删除的文件和文件夹,不送到回收站

D)218

B)在同一个文件夹中,可以创建两个同类、同名的文件 C)删除了某个应用程序的快捷方式,将删除该应用程序对应的文件
105

D)不能打开两个写字板应用程序 11.运算式(2047)10 -(3FF)16 +(2000)8 的结果是( A) (2048)10 B) (2049)10 C) (3746)8 ) D) (1AF7)16

12.TCP/IP 协议共有( )层协议 A)3 B)4

C) 5

D )6

13.若已知一个栈的入栈顺序是 1,2,3,….. ,n,其输出序列为 P1,P2,P3,….. ,Pn,若 P1 是 n,则 Pi 是( ) A)i 14.计算机病毒是( B)n-i ) C)n-i+1 D) 不确定

A) 通过计算机传播的危害人体健康的一种病毒 B) 人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合 C) 一种由于计算机元器件老化而产生的对生态环境有害的物质 D) 利用计算机的海量高速运算能力而研制出来的用于疾病预防的新型病毒 E) 15.下面关于算法的错误说法是( A)算法必须有输出 C)算法不一定有输入 16.[x]补码=10011000,其原码为( A)011001111 B)11101000 17.以下哪一个不是栈的基本运算( A)删除栈顶元素 C)判断栈是否为空 ) C)11100110 ) B)删除栈底元素 D)将栈置为空栈 D)01100101 ) B)算法必须在计算机上用某种语言实现 D)算法必须在有限步执行后能结束

18.在顺序表(2,5,7,10,14,15,18,23,35,41,52 )中,用二分法查找 12,所需 的关键码比较的次数为( ) A)2 B)3 C)4 D)5 )个结点

19.一棵二叉树的高度为 h,所有结点的度为 0,或为 2,则此树最少有( A)2h -1 B)2h-1 C)2h+1 D)h+1

20.无向图 G=(V,E) ,其中 V={a,b,c,d,e,f},E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)} 对该图 进行深度优先遍历,得到的顶点序列正确的是( ) A)a,b,c,d,e,f B) a,c,f,e,b,d C) a,e,b,c,f,d D) a,b,e,d,f,c

106

二.问题求解( 5+7=12 分) 1. 已 知 一 棵 二 叉 树 的 结 点 名 为 大 写 英 文 字 母 ,其 中 序 与 后 序 遍 历 的 顺 序 分 别为 : CBGEAFHDIJ 与 CGEBHFJIDA 则该二叉树的先序遍历的顺序为: 2. 平面上有三条平行直线,每条直线上分别有 7,5,6 个点,且不同直线上三个点都不在同 一条直线上,问用这些点为顶点,能组成多少个不同四边形? 三.阅读程序,写出程序的正确运行结果( 4+7+8+9=28 分) 1. PROGRAM GAO7_1; FUNCTION ACK( M,N:INTEGER) :INTEGER; BEGIN IF M=0 THEN ACK:=N+1 ELSE IF N=0 THEN ELSE END; BEGIN WRITELN(ACK(3,4) ) ;READLN; END. 输出: 2. PROGRAM GAO7_2; VAR P,Q,S,T :INTEGER; BEGIN READLN(P) ; FOR Q:=P+1 TO 2*P DO BEGIN T :=0;S:=(P*Q)MOD (Q-P) ; IF S=0 THEN BEGIN T :=P+Q+(P*Q) DIV (Q-P) ;WRITE(T :4) ;END; END; END. 输入:12 3. PROGRAM VAR 输出: GAO7_3;

ACK:=ACK(M-1,1) ACK:=ACK(M-1, ACK(M,N-1) )

I ,J ,H,M,N, K:INTEGER; B:ARRAY[1..10] OF INTEGER;

BEGIN READLN(N) ; FOR I :=1 TO 10 DO BEGIN M:=N;J :=11;
107

WHILE M>0 DO BEGIN J :=J -1;B[J]:=M MOD 10;M:=M DIV 10 END; FOR H:=J TO 10 DO END; WRITELN(N) ; END. 输入:1234 输出: N:=N+B[H] ;

4. PROGRAM GAO7_4; VAR X, Y1, Y2, Y3:INTEGER; BEGIN READLN(X) ; Y1:=0; Y2:=1; Y3:=1; WHILE Y2<=X DO BEGIN Y1:=Y1+1; Y3:=Y3+2; Y2:=Y2+Y3 END; WRITELN(Y1) ; END. 输入:23420 输出:

四.完善程序 (每空`3 分,共 30 分) 1. 存储空间的回收算法。设在内寸中已经存放了若干个作业 A, B, C,D。其余的空间为 可用的(如图一中(a) ) 。

100 300 500

A 50 B 100 C 100 D
图一(a)

d d d d

L 下靠 L 上, 下靠 L 上,下不靠 L
图一(b)

此时, 可用空间可用一个二维数组 dk[1..100, 1..2]表示, (如下表一中 (a) ) , 其中: dk[i,1] 对应第 i 个可用空间首址,dk[i,2]对应第 i 个可用空间长度如上图中,dk: 100 300 500 50 100 100 0 100 300 500 表一(a) 10000 0 50 100 100 0

表一(b)

108

现某个作业释放一个区域,其首址为 d,长度为 L,此时将释放区域加入到可用空间中。 要求在加入时,若可用空间相邻时,则必须进行合并。因此出现下面的 4 种情况(如上图一 (b)所示) 。 (1) 下靠,即回收区域和下面可用空间相邻,例如 d=80,L=20,此时成为表二中的(a). (2) 上靠,例如,d=600,L=50,此时表成为表二中的(b) 。 (3) 上、下靠,例如,d=150,L=150,此时表成为表二中的(c ) 。 (4) 上、下不靠,例如,d=430,L=20,此时表成为表二中的(d) 。 80 300 500 70 100 100 100 300 500 50 100 150 100 500 300 100 100 300 430 500 表二(a) (下靠) 表二(b) (上靠) 表二(c ) (上、下靠) 50 100 20 100

表二(d) (上、下不靠)

程序说明:对数组 dk 预置 2 个标志,即头和尾标志,成为表一(b),这样可使算法简单,sp 为 dk 表末地址。 程序清单: PROGRAM GAO7_5; V AR I ,J ,SP,D,L:INTEGER; DK:ARRAY[0..100,1..2] OF INTEGER; BEGIN READLN(SP) ; FOR I :=1 TO SP DO READLN(DK(I,1) ,DK[I ,2]) ; DK[0,1]:=0;DK[0,2]:=0: ① ; DK[SP,1]:=10000;DK[SP,2]:=0;READLN(D, L) ;I:=1; WHILE DK[I ,1]<D DO I :=I+1; ② ; IF (D+L=DK[I+1,1] THEN BEGIN DK[I,2]:= ③ ; IF (DK[I,1]+DK[I ,2]=D) THEN

FOR J :=I+1 TO SP -1 DO DK[J]:=DK[J+1] ; SP:=SP-1; ELSE END IF (D+L=DK[I+1,1]) THEN BEGIN DK[I+1,1]:= ④ ;

DK[I+1,2]:=DK[I+1,2]+L;
109

END ELSE BEGIN FOR J :=SP DOWNTO I+1 DO DK[J+1] :=DK[J] ; ⑤ END; FOR I :=1 TO SP-1 DO WRITELN(DK[I,1] :4,DK[I ,2]:4);READLN; END. 2. 关键路径 设有一个工程网络如下图表示(无环路的有向图) : 其中,顶点表示活动,①表示工程开始,④⑤表示工程结束(可变,用 N 表示) ,边上的 数字表示活动延续的时间。 ② 5 ① 4 ③ 如上图中,活动①开始 5 天后活动②才能开始,而活动③则要等①、②完成之后才能开始, 即最早也要 7 天后才能工作。 在工程网络中,延续时间最长的路径称为关键路径。上图中的关键路径为: ①→②→③→④→⑤ 共 18 天完成。 关键路径的算法如下: 1. 数据结构: R[1..N,1..N] OF INTEGER;表示活动的延续时间,若无连线,则用 -1 表示; EET[1..N] 表示活动最早可以开始的时间; ET[1..N] 表示活动最迟应该开始的时间 关键路径通过点 J ,具有如下的性质:EET[J]=ET[J] 2. 约定: 结点的排列已经过拓扑排序,即序号前面的结点会影响序号后面结点的活动。 程序清单: PROGRAM GAO7_6; V AR I ,J ,N,MAX,MIN,W,X, Y:INTEGER; R:ARRAY[1..20,1..20] OF INTEGER; EET ,ET :ARRAY[1..20] OF INTEGER; BEGIN READLN(N) ; FOR I :=1 TO N DO FOR J :=1 TO N DO R[I,J]:=--1; READLN(X, Y,W) ;{输入从活动 X 到活动 Y 的延续时间,以 0 为结束}
110

:=D;DK[I+1,2]:=L;SP:=SP+1;

6 2 5 ④

6



WHILE X<>0 DO BEGIN R[X,Y]:=W; ① END; EET[1] :=0;{认为工程从 0 天开始} FOR I :=2 TO N DO BEGIN MAX:=0; FOR J :=1 TO N DO R[J ,I]<> -1 THEN IF ② THEN EET[I] :=MAX; END; ③ FOR I :=N-1 DOWNTO 1 DO BEGIN MIN:=10000; FOR J :=1 TO N DO IF R[I ,J]<> -1 THEN IF ④ ET[I] :=MIN; END; WRITELN(EET[N] ) ; FOR I :=1 TO N-1 DO IF ⑤ WRITE(N) ;READLN; END. THEN WRITE(I, ‘->’ ) ; THEN MIN:=ET[J] -R[I,J]; IF MAX:=R[J ,I]+EET[J] ; ;

111

第六届(2000 年)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一. 选择一个正确答案代码,填入每题的括号内(每题 1.5 分,多选无分,共 30 分) 1.下列无符号数中,最小的数是( ) A.(11011001)2 B.(75)10 C.(37)8 D.(2A)16 2.在外部设备中,绘图仪属于( A. 输入设备 B.输出设备 C. 辅(外)存储器 )构成的 C. 运算器 D.内存储器 D.主(内)存储器

3.计算机主机是由 CPU 与( A. 控制器

B. 输入、输出设备

4.计算机病毒的特点是( ) A. 传播性、潜伏性、易读性与隐蔽性 C. 传播性、潜伏性、破坏性与隐蔽性

B. 破坏性、传播性、潜伏性与安全性 D. 传播性、潜伏性、破坏性与易读性

5.WINDOWS 9X 是一种( )操作系统 A. 单任务字符方式 B. 单任务图形方式 C. 多任务字符方式 D. 多任务图形方式 6.Internet 的规范译名应为( ) A. 英特尔网 B. 因特网 C. 万维网 7.计算机网络是一个( )系统 A.管理信息系统 B.管理数据系统 8.计算机系统总线上传送的信号有( A.地址信号与控制信号 C.控制信号与数据信号

D. 以太网

C.编译系统 )

D. 在协议控制下的多机互连系统

B. 数据信号、控制信号与地址信号 D. 数据信号与地址信号

9.计算机的运算速度取决于给定的时间内,它的处理器所能处理的数据量。处理器一次能处 理的数据量叫字长。 已知 64 位的奔腾处理器一次能处理 64 个信息位, 相当于 ( A.8 个 B.1 个 C.16 个 D. 2 个 10.某种计算机的内存容量是 640K,这里的 640K 容量是指( )个字节 A.640 B. 640*1000 C. 640*1024 D. 640*1024*1024 11.下面哪些计算机网络不是按覆盖地域划分的( )
112

) 字节。

A.局域网

B. 都市网

C.广域网

D. 星型网 )

12.在有 N 个叶子节点的哈夫曼树中,其节点总数为( A.不确定 B. 2N-1 C. 2N+1 D. 2N

13. 已知数组中 A 中,每个元素 A(I,J )在存贮时要占 3 个字节,设 I 从 1 变化到 8,J 从 1 变化到 10,分配内存时是从地址 SA 开始连续按行存贮分配的。试问:A(5,8)的起始地 址为( ) A.SA+141 B. SA+180 C. SA+222 D. SA+225 )

14. 不同类型的存储器组成了多层次结构的存储器体系, 按存取速度从快到慢的排列是 ( A. 快存/辅存/主存 B. 外存/主存/辅存 C. 快存/主存/辅存 D. 主存/辅存/外存

15. 某数列有 1000 个各不相同的单元,由低至高按序排列;现要对该数列进行二分法检索 (binary-search) ,在最坏的情况下,需检视( A.1000 B. 10 C. 100 D. 500 )个单元。

16. 请仔读下列程序段: Var a:array[1..3,1..4]of integer; b:array[1..4,1..3]of integer; x,y:integer; begin for x:=1to3do for y:=1to4do a[x,y]:=x-y; for x:=4 downto 1 do for y:=1 to 3 do b[x,y]:=a[y,x]; writeln(b[3,2]); end. 上列程序段的正确揄出是( A.-1 B. -2 C. -3 )

D. –4 )

17. 线性表若采用链表存贮结构,要求内存中可用存贮单元地址( A. 必须连续 B. 部分地址必须连续 ) C. 一定不连续

D. 连续不连续均可

18. 下列叙述中,正确的是( C. 栈的操作方式是先进先出

A. 线性表的线性存贮结构优于链表存贮结构

B. 队列的操作方式是先进后出

D. 二维数组是指它的每个数据元素为一个线性表的线性表
113

19. 电线上停着两种鸟(A, B) ,可以看出两只相邻的鸟就将电线分为了一个线段。这些线段 可分为两类:一类是两端的小鸟相同;另一类则是两端的小鸟不相同。 已知: 电线两个顶点上正好停着相同的小鸟, 试问两端为不同小鸟的线段数目一定是 ( A. 奇数 B. 偶数 C. 可奇可偶 D. 数目固定 ) 。

20. 一个文本屏幕有 25 列及 80 行,屏幕的左上角以(1,1)表示,而右下角则以(80,25) 表示,屏幕上每一个字符占用两字节(byte) ,整个屏幕则以线性方式存储在电脑的存储器内, 内屏幕左上角开始,位移为 0,然后逐列逐列存储。求位於屏幕(X,Y)的第一个字节的位 移是( ) A. ( Y*80+X)*2-1 C. (Y*80+X-1)*2 B. ( (Y -1)*80+X-1)*2 D. ( (Y -1)*80+X)*2-1

二.问题求解: ( 6+6=12 分) 1. 已知,按中序遍历二叉树的结果为:abc 问:有多少种不同形态的二叉树可以得到这一遍历结果,并画出这些二叉树。 2. 设有一个共有 n 级的楼梯,某人每步可走 1 级,也可走 2 级,也可走 3 级,用递推公式给 出某人从底层开始走完全部楼梯的走法。 例如: 当 n=3 时, 共有 4 种走法, 即 1+1+1, 1+2, 2+1,3。 三、阅读程序,并写出正确的运行结果(每题 10 分,共 20 分) 1. program noi_001; const n=7; m=6; var i,j,x0,y0,x1,y1,x2,y2:integer; d:real; p:boolean; g:array[0..n,0..m] of 0..1; function disp(x1,y1,x2,y2:integer):real; begin disp:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); end; begin for i:=0 t0 n do for j:=0 to m do g[i,j]:=0;

readln(x1,y1,x2,y2); g[x1,y1]:=1; g[x2,y2]:=1; p:=true; while p do begin p:=false; d:=disp(x1,y1,x2,y2); x0:=x1; y0:=y1; for i:=4 to n do for j:=0 to m do if (d>disp(i,j,x2,y2))and(g[i,j]=0)then begin d:=disp(i, j,x2,y2); x0:=i; y0:=j; end; if (x0<>x1) or (y0<>y1) then begin x1:=x0; y1:=y0; p:=true; g[x1,y1]:=1; end;
114

d:=disp(x1,y1,x2,y2); x0:=x2; y0:=y2; for i:=0 to 3 do for j:=0 to m do if(d<disp(x1,y1,i,j)and(g[i,j]=0) then begin d:=disp(x1,y1,i,j); x0:=i; y0:=j end; if (x0<>x2)or(y0<>y2) then begin x2:=x0;y2=y0;p:=true; g[x2,y2]:=1; end; end; writeln(x1,y1,x2,y2) end. 输入:7 6 0 0 输出:

2. program noi_002; var i,j,l,n,k,s,t:integer; b:array[1..10] of 0..9; begin readln(l,n); s:=l; k:=1; t:=l; if n>l then begin while s<n do begin k:=k+1;t:=t*l;s:=s+t end; s:=s-t;n:=n-s-1; for i:=1 to 10 do b[i]:=0; j:=11; while n>0 do begin j:=j-1; b[j]:=n mod l; n:=n div l end; for i:=10-k+1 to 10 do write(chr(ord(’a ’)+b[i])); readln; end else writeln(chr(ord(’a’)+n-1)) end 输入: 4 167 输出:

四、完善程序(共 38 分) 1.问题描述:将 2 个 0 和 2 个 1,排成一个圈。从任一个位置 开始, 每次按逆时针的方向以长度为 n+1 的单位进行数二进制数。 要求给出一种排法,用上面的方法产生出来的 2n+1 个二进制数都 不相同。 2 2 例如, 当 n=2 时, 即 2 个 0 和 2 个 1 排成如下一圈, 见右图: 比如,从 A 位置开始,逆时针方向取三个数 000,然后再从 B 位 置上开始取三个数 001, 接着从 C 开始取三个数 010, …可以得到
n n

115

000,001,010,101,011,111,110,100 共 8 个二进制数且都不相同。 程序说明:以 N=4 为例,即有 16 个 0,16 个 1,数组 A 用以记录 32 个 0,1 的排法,数组 B 统计二进制数是否已出现过。 程序清单 program noi00; var a :array[1..36] of 0..1; b :array[0..31] of integer; i,j,k,s,p:integer; begin for i:=1 to 36 do a[i]:=0; for i:=28 to 32 do a[i]:=1; p:=1;a[6]:=1; while (p=1) do begin j:=27; while a[j]=1 do j:=j-1; ( ① ) for i:=j+1to 27 do( ② for i:=0 to 31 do b[1]:=o; for i:=1 to 32 do begin ( ③ ) for k:=i to i+4 do s:=s*2+a[k]; ( ④ ) end; s:=0; for i:=0 to 31 do s:=s+b[i]; if( ⑤ )then p:=0 end; for i:=1 to 32 do for j:=i to i+4 do write(a[j]); writeln end. 2. 问题描述: 求出一棵树的深度和宽度。 例如有如右图所示的一棵树: 其树的深度为从根结点开始到叶结点结束的最大深度,树的宽度为同 一层上结点数的最大值。在上图中树的深度为 4,宽度为 3。用邻接表 来表示树,上图中的树的邻接表示如下: 程序清单



116

program noi00_6; var i,j,sp1,sp2,l,max:integer; tree:array[1..20,1..6]of integer; q:array[1..100,0..6] of integer; d:array[0..20]of integer; begin for i:=1 to 14 do for j:=1 to 6 do tree[i,j]:=o; for j:=1 to 14 do tree[j,1]:=j; tree[1,2]:=2; tree [1,3]:=3; tree[1,4]:=4; tree[2,2]:=5; tree[2,3]:=6; tree [3,2]:=7; tree[3,3]:=8; tree[4,2]:=9; tree[4,3]:=10; tree[4,4]:=11; tree[7,2]:=12; tree[7,3]:=13; tree[13,2]:=14; sp1:=1; sp2:=1; for i:=1 to 6 do q[1,i] :=tree[1,i]; q[1,0]:=1; while( ① ) do

begin l:=( ② ); j:=2; while( ③ )do begin sp2:=sp2+1;q[sp2,0]:=l;q[sp2,1]:=q[sp1,j]; for i:=2 to 6 do q[sp2,i]:=tree[q[sp1,j],i]; j:=j+1 end; sp1:=sp1+1 end; writeln( ④ ) for i:=0 to 20 do d[i]:=0; for i:=1 to sp2 do d[q[i,0]]:=( ⑤ max:=d[1]; for i:=2 to 20 do if d[i]>max then max:=d[i]; writeln(max); end. readln; )

1 2 3 4 5 6 7

2 0 5 6 0 7 0

3 0 0 0 0 0 0

4 0 0 0 0 0 0

0 0 0 0 0 0 0

0 0 0 0 0 0 0

树的邻接表

117

第五届(1999 年)全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 ●● 二小时完成 ) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效

一.选择一个正确答案代码,填入每题的话号内(每题 1.5 分,多选无分,共 30 分) 1. 微机内存储器的地址是按( )编址的。 A. 二进制位 B. 字长 C. 字节 D. 微处理器的型号 2. 下列诸因素中,对微机工作影响最小的是( ) A. 尘土 B. 噪声 C. 温度 D. 湿度

3. 在 24*24 点阵的“字库”中,汉字“一”与“编”的字模占用字节数分别是( ) A.32,32 B.32,72 C.72,72 D.72,32

4. 将 DOS 系统盘插入 A 驱动器启动机器,随后使用一批应用软件,在此过程中,DOS 系统盘 ( ) A. B. 必须始终插入在 A 驱动器中 C. 可能有时要插入 A 驱动器中 B. 不必再用 D. 可能有时要插入 B 驱动中

5. 以下 DOS 命令中,有可能在磁盘上建立子目录的是( ) . A.type B. dir C.xcopy D.cd 6. 在 config.sys 文件中,装入特定的可安装设备驱动程序的命令是( ) . A.buffer B.files C.driver D.device ) . C.ASCII 码与汉字代码 D. 数字与字符

7. 计算机能直接执行的指令包括两部分,它们是( A. 源操作数与目标操作数 B. 操作码与操作数 ) .

8、在微机中;通用寄存器的位数是( A 8 位 B.16 位

C. 计算机字长 D.32 位 ) D.补码

9. 在计算机中,字符编码通常采用( A. 原码 B. 反码 C.ASCII 码

10. 计算机的软件系统通常分为( ) A 系统软件与应用软件 B 高级软件与一般软件 C 军用软件与民用软件 D 管理软件与控制软件 11. 执行 DOS 命令:C>A TTRIB A:*.*的功能是( )
118

A. 查看 A 盘上所有文件属性 B. 查看 A 盘上当前目录中所有文件属性 C. 查看 A 盘上所有系统文件属性 D. 删去 A 盘上所有隐含文件的属性 12. 执件下列 DOS 命令,效果等价的是( )组. A. copy *.for 与 copy *.for con B. copy A: *.* B: 与 xcopy A:*.* B: C. copy fole1.txt + file2.txt 与 copy flle2.txt + file1.txt D. xcopy A:*.* B:/S 与 diskcopy A: B: 13. 已知小写字母‘m’的十六进制的 ASCll 码值是 6D,则小写字母‘c ’的十六进制的 ASCll 码值是( A.98 ) B.62 C.99 D.63 )两部分组

14、计算机中的数有浮点数与定点数两种,其中用浮点数表示的数,通常由( 成。 A. 指数与基数 B. 尾数与小数 C. 阶码与尾数 D. 整数与小数

15. 下列文件名中,属于 DOS 中的保留设备名的为( ) A.AUX B.COM C.CON1 D.PRNL

16 启动计算机引导 DOS 是将操作系统( ) A. 从磁盘调入中央处理器 B. 从内存储器调入高速缓冲存储器 C. 从软盘调入硬盘 D. 从系统盘调入内存储器

17. 十进制算术表达式:3*512+7*64+4*8+5 的运算结果,用二进制表示为( ) . A. 10111100101 B.11111100101 C.1111l0100101 D.11111101101

l8.组成’教授’ ( jiao shou )’副教授’ (fu jiao shou )与’讲师’ ( jiang shi)这三个词的 汉字,在 GB2312-80 字符集中都是一级汉字.对这三个词排序的结果是( A 教授,副教授,讲师 B.副教授,教授,讲师 C 讲师,副教授,教授 D.副教授,讲师,教授 19. 不同的计算机,其指令系统也不同,这主要取决于( ) . D.所用的程序设计语言 ) .

A 所用的操作系统 B. 系统的总体结构 C.所用的 CPU

20.对具有隐含属性(H)的当前目录下的文件 ab. txt,能成功执行的 DOS 命令是( ) A. TYPE ab.txt B.COPY ab. txt xy. txt C. DIR ab.txt D. REN ab. txt xy. Txt 二.回答问题: ( 10 分)
119

将 Ln 定义为求在一个平面中用 n 条直线所能确定的最大区域数目,例如:当 n=1 时, L1=2,进一步考虑,用 n 条折成角的直线(角度任意) ,放在平面上能确定的最大区域数目 Zn 是多少?例如当 n=1 时,Z1=2(如下图所示) :

1 2
1、 program exgp1; var i,j,k:integer; a:array[0..100] of integer; begin for i:=0 to 100 do a[i]:=i; for k:=5 downto 2 do begin for i:=1 to 100 do

当给出 n 后,请写出以下的表达式: Ln=_______________________ Zn=_______________________ 15 分,共 30 分)

三.阅读程序,并写出程序的正确运行结果: (每题

if (i mod k)=0 then a[i]:=0; for i:=1 to 99 do for j:=1 to 100-i do if a[j]>a[i+1] then begin a[j]:=a[j+1]; a[j+1]:=a[j]-a[j+1]; a[j]:=a[j]-a[j+1]; end; end; j:=1; while (a[j]=0) and (j<100) do j:=j+1; for i:=j to 100 do a[0]:=a[0]+a[i]; writeln(a[0]); end. 本题的运行结果是: 2、 设数组 A[1], A[2],?A[N],已存入了数据,调用不同的排序程序,则数据比较的次数 将会不同,试计算出分别调用下列不同的排序程序的比较运算的次数。其中 SWAP(I,J ) 表示 A[I]与 A[J]进行交换。 ⑴ PROCEDURE SORT1(N:INTEGER) ; var I,j:integer; begin for I:=1 to n-1 do
120

for j:=1 to n do if a[j]<a[I] then swap(I,j) end; 调用该过程的语句为 SORT1(N) ,比较运算的次数为: ⑵ PROCEDURE SORT2(I,N:INTEGER) ; var j:integer; begin if I=n then write(a[n]); else for j:=I+1 to n do if a[j]<a[I] then swap(I,j) write(a[I]); sort2(I+1,n) end; 调用该过程的语句为 SORT2(N) ,比较运算的次数为: ⑶ PROCEDURE SORT3(I,J :INTEGER) ; var m:integer; begin if I<>j then begin m:=(I+j) div 2; sort3(I,m);sort3(m+1,j); merge;{假设合并的元素分别为 P,G 个,需要比较 P+G 次}; end; end; 调用该过程的语句为 SORT3(N) ,比较运算的次数为: 四、根据题意,将以下程序填写完整(共 30 分) 1.[问题描述]求一棵树的深度与宽度; (15 分) 树可用数组 TREE: ARRAY[1..N,1..5] OF INTEGER; 其中:TREE[I ,1]表示结点号;TREE[1,2]-------TREE[1,5]所属结点 1 2 5 6 11 7 12 3 8 9 4 10

13
如上图可表示为:
121

1 2 3 4 5 6 7 8 9 10 11 12

2 5 8 9 0 0 11 0 0 0 0 13

3 6 0 10 0 0 12 0 0 0 0 0

4 7 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

13 0 0 0 0 在求解过程中,用到数组 G:ARRAY[1..N,1..7] OF INTEGER; 其中:G[I,1]表示父结点,G[I,2]表示层次,G[I,3]表示本结点号,G[I,4]-----G[I,7]表示子女结点;同时,设 2 个指针 SP1(取数指针) ,SP2(存数指针) [程序清单] program exgp3; const n=13; var I,j,k,sp1,sp2,n1,n2,jmax,p:integer; tree:array[1..n,1..5] of integer; g:array[1..n,1..7] of integer; begin for I:=1 to n do begin tree[I,1]:=I; for j:=2 to 5 do read(tree[I,j]); readln; end; sp1:=1;sp2:=1;g[1,1]:=0;g[1,2]:=1;g[1,3]:=1; for I:=4 to 7 do g[1,I]:=tree[1,I-2]; while 1 do begin p:=g[sp1,2];n2:=g[sp1,3]; while begin n1:=g[sp1,j]; j:=j+1; 4 ; g[sp2,1]:=n2;g[sp2,2]:=p;g[sp2,3]:=n1; for I:=1 to 4 do g[sp2,I+3]:=tree[n1,I+1]; 3 do

2

; j:=4;

122

end; 5 end; writeln(‘maxd=’,g[sp2,2]); j:=1; k:=g[1,2]; jmax:=0; for I:=2 to sp2 do if else begin if j>jmax then jmax:=j; 7 end; if j>jmax then jmax:=j; writeln(‘maxl=’,jmax); end. 2.[问题描述] 用生成法求出 1,2,………,r 的全排列(r<=8) (15 分) [算法过程] 用数组 a:array[1..r] of integer ;表示全排列; 初始化时,a[i]:=i,(i=1,2,….,r), 设中间的某个排列为 a[1],a[2],….a[r], 则求出下一个排列的算法为: (1) 从后面向前找,直到找到一个顺序为止 (设下标为 j-1,则 a[j-1]<a[j] ) (2) 从 a[j]……..a[r] 中,找出一个 a[k]比 a[j-1]大的最小元素 (3) 将 a[j-1]与 a[k]交换 (4) 将 a[j],a[j+1],….,a[r] 由小到大排序 [程序清单] program exg4; const r=7; var n,I,s,k,j,i1,t:integer; a:array[1..r] of integer; procedure print1; var ik:integer; begin for ik:=1 to r do write(a[ik]:8); writeln; end; begin for I:=1 to r do print1; s:=1; for I:=2 to r do s:=s*I;
123

;

6

then j:=j+1

; k:=g[I,2];

1

;

s:=s-1; for I:= begin j:=r; while

2

do

3

do j:=j-1;

k:=j; for i1:=j+1 to r do if 4 then k:=i1; t:=a[j-1]; a[j-1]:=a[k]; a[k]:=t; for i1:=j to r-1 do for k:=i1+1 to r do if 5 begin end; print1; end; end. then

t:=a[i1]; a[i1]:=a[k]; a[k]:=t;

124


1999年至2010年历年信息学奥赛提高组初赛试题

1999年至2010年历年提高组信息学奥赛初赛试题1999年至2010年历年提高组信息学奥赛初赛试题。隐藏>> 福建省莆田第一中学 信息学奥赛兴趣小组 整理:林梓雨 第十六...

1999年至2011年历年信息学奥赛提高组初赛答案

福建省莆田第一中学 信息学奥赛兴趣小组 整理:林梓雨 第十七届(2011 年)信息学奥赛提高组初赛试题答案一、单项选择题(共 10 题,每题 1.5 分,共计 15 分) ...

1999年—2011年信息学奥赛提高组初赛试题PASCAL(附答案_完整)1

1999年—2011年信息学奥赛提高组初赛试题PASCAL(附答案_完整)1_学科竞赛_高中教育_教育专区。历届全国青少年 信息学奥林匹克联赛 初赛试题(提高组 Pascal 语言) ...

历届信息学奥赛选择题

泰安市实验学校 第五届全国青少年信息学计算机奥林匹克分区联赛初赛试题(1999 年)...bbdad cbcbc bcbcb 第九届分区联赛提高组初赛试题(2003 年)一.单项选择题 1...

第十九届2013全国青少年信息学奥林匹克联赛初赛试题C++及解析

第十九届2013全国青少年信息学奥林匹克联赛初赛试题C++及解析_学科竞赛_高中教育_教育专区。第十九届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2...

2013年第十九届全国青少年信息学奥林匹克联赛提高组初赛试题

2013年第十九届全国青少年信息学奥林匹克联赛提高组初赛试题_自我管理与提升_求职/职场_应用文书。第十九届全国青少年信息学奥林匹克联赛初赛提高组 Pascal 语言试题竞赛...

2013年第十九届全国青少年信息学奥林匹克联赛提高组初赛试题-1

第十九届全国青少年信息学奥林匹克联赛初赛 提高组 Pascal 语言试题 竞赛时间:2013 年 10 月 13 日 14:30~16:30 选手注意: 试题纸共 12 页,答题纸共 2 ...

历届奥赛试题解析-初赛

历届奥赛试题解析-初赛_学科竞赛_小学教育_教育专区。省淳中信息学奥赛辅导 奥赛...十九届(2013)试题 19.1 十九届普及组 19.2 十九届提高组一、单项选择题(共...

2013第十九届全国青少年信息学奥林匹克联赛初赛提高组(C++)

2013 第十九届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2013 年 10 月 13 日 14:30~16:30 选手注意:试题纸共有 12 页,答题纸共有 ...