1、第十九届全国青少年信息学奥林匹克联赛初赛提高组 Pascal 语言试题竞赛时间:2013 年 10 月 13 日 14:3016:30选手注意:l试题纸共有 12 页,答题纸共有 2 页,满分 100 分。请在答题纸上作答,写在试题纸上 的一律无效。l不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。一、单项选择题(共 15 题,每题 1.5 分,共计 22.5 分;每题有且仅有一个正确 选项)1.一个 32 位整型变量占用()个字节。A.4B.8C.32D.1282.二进制数 11.01 在十进制下是()。A.3.25B.4.125C.6.25D.11.1253.下面的故
2、事与()算法有着异曲同工之妙。从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山 里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个 老和尚给小和尚讲故事.A.枚举B.递归C.贪心D.分治4.1948 年,()将热力学中的熵引入信息通信领域,标志着信息论研究的开端。A.冯诺伊曼(John von Neumann)B.图灵(Alan Turing)C.欧拉(Leonhard Euler)D.克劳德香农(Claude Shannon)5.已知一棵二叉树有 2013 个节点,则其中至多有()个节点有 2 个子节点。A.1006B.1007C.1023D.1
3、0246. 在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通 图。右图是一个有 5 个顶点、8 条边的连通图。若要使它不再是连通 图,至少要删去其中的( )条边。CCF NOIP2013 初赛提高组C 语言试题第 12 页,共 12 页A.2B.3C.4D.57.斐波那契数列的定义如下:F1 = 1, F2 = 1, Fn = Fn 1 + Fn 2 (n 3)。如果用下面的函数计 算斐波那契数列的第 n 项,则其时间复杂度为()。funtion F(n : longint) : longint;beginif n = 2 thenF := 1 elseF := F(n - 1)
4、+ F(n - 2);end;A.O(1)B.O(n)C.O(n2)D.O(Fn)8.二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于其右子 树上所有节点的值。那么,二叉查找树的()是一个有序序列。A.先序遍历B.中序遍历C.后序遍历D.宽度优先遍历9.将(2, 6, 10, 17)分别存储到某个地址区间为 010 的哈希表中,如果哈希函数 h(x) =(),将不会产生冲突,其中 a mod b 表示 a 除以 b 的余数。A.x mod 11B.x2 mod 11C.2x mod 11D. mod 11,其中 表示 下取整10. IPv4 协议使用 32 位地址,随着其
5、不断被分配,地址资源日趋枯竭。因此,它正逐渐被使用()位地址的 IPv6 协议所取代。A.40B.48C.64D.12811. 二分图是指能将顶点划分成两个部分,每一部分内的顶点间没有边相连的简单无向图。 那么,12 个顶点的二分图至多有()条边。A.18B.24C.36D.6612. ()是一种通用的字符编码,它为世界上绝大部分语言设定了统一并且唯一的二进 制编码,以满足跨语言、跨平台的文本交换。目前它已经收录了超过十万个不同字符。A.ASCIIB.UnicodeC.GBK 2312D.BIG513. 把 64 位非零浮点数强制转换成 32 位浮点数后,不可能()。A.大于原数B.小于原数C
6、.等于原数D.与原数符号相反14. 对一个 n 个顶点、m 条边的带权有向简单图用 Dijkstra 算法计算单源最短路时,如果不使用堆或其它优先队列进行优化,则其时间复杂度为()。A.O(mn + n3)B.O(n2)C.O(m + n) log n)D.O(m + n2) 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.(n2 log n)二、不定项选择题(共 5 题,每题 1.5 分,共计 7.5 分;每题有一个或多
7、个正确 选项,多选或少选均不得分)1.下列程序中,正确计算 1, 2, , 100 这 100 个自然数之和 sum(初始值为 0)的是()。A.for (i = 1; i 100) sum += i; i+;C.i = 1; do sum += i; i+; while (i 100);2.()的平均时间复杂度为 O(n log n),其中 n 是待排序的元素个数。A.快速排序B.插入排序C.冒泡排序D.归并排序3.以 A0 作为起点,对下面的无向图进行深度优先遍历时(遍历的顺序与顶点字母的下标 无关),最后一个遍历到的顶点可能是()。A.A1B.A2C.A3D.A44.()属于 NP 类问
8、题。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 个数 a1, a2, , an,均为 0 或
9、1,请用户回答(s1a1 + s2a2 + + snan)除以 2 的余数。如果多次的回答总是正确,即认为掌握密码。该系统认为,即使 问答的过程被泄露,也无助于破解密码因为用户并没有直接发送密码。然而,事与愿违。例如,当 n = 4 时,有人窃听了以下 5 次问答:问答编号系统生成的 n 个数掌握密码的用户的回答a1a2a3a4111001200110301100411100510000就破解出了密码 s1 = ,s2 = ,s3 = ,s4 = 。2. 现有一只青蛙,初始时在 n 号荷叶上。当它某一时刻在 k 号荷叶上时,下一时刻将等概 率地随机跳到 1, 2, , k 号荷叶之一上,直至跳
10、到 1 号荷叶为止。当 n = 2 时,平均一共 跳 2 次;当 n = 3 时,平均一共跳 2.5 次。则当 n = 5 时,平均一共跳 次。12345四、阅读程序写结果(共 4 题,每题 8 分,共计 32 分)1.#include#includeconstintSIZE=100;intmain()intn,i,isPlalindrome;charstrSIZE;scanf(%s,str);n=strlen(str);isPlalindrome=1;for(i=0;in/2;i+)if(stri!=strn-i-1)isPlalindrome=0;if(isPlalindrome)prin
11、tf(Yesn);elseprintf(Non);return0;输入:abceecba输出:_2.#includeintmain()inta,b,u,v,i,num;scanf(%d%d%d%d,&a,&b,&u,&v);num=0;for(i=a;i=b;i+)if(i%u)=0)|(i%v)=0)num+;printf(%dn,num);return0;输入:110001015输出:_3.#includeconstintSIZE=100;intmain()intheightSIZE,numSIZE,n,ans;inti,j;scanf(%d,&n);for(i=0;in;i+)scanf
12、(%d,&heighti);numi=1;for(j=0;ji;j+)if(heightj=numi)numi=numj+1;ans=0;for(i=0;ians)ans=numi;printf(%dn,ans);return0;输出:832511127410输出:_4.#include#include#defineSIZE100intn,m,p,count;intaSIZESIZE;voidcolour(intx,inty)count+;axy=1;if(x1)&(ax-1y=0)colour(x-1,y);if(y1)&(axy-1=0)colour(x,y-1);if(xn)&(ax+1
13、y=0)colour(x+1,y);if(ym)&(axy+1=0)colour(x,y+1);intmain()inti,j,x,y,ans;memset(a,0,sizeof(a);scanf(%d%d%d,&n,&m,&p);for(i=1;i=p;i+)scanf(%d%d,&x,&y);axy=1;ans=0;for(i=1;i=n;i+)for(j=1;j=m;j+) if(aij=0)count=0;colour(i,j); if(anscount)ans=count;printf(%dn,ans);return0;输入:659142324324143455464输出:_五、完善
14、程序(第 1 题 15 分,第 2 题 13 分,共计 28 分)1.(序列重排)全局数组变量 a 定义如下:#defineSIZE100intaSIZE,n;它记录着一个长度为 n 的序列 a1, a2, , an。现在需要一个函数,以整数 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):voidsw
15、ap1(intp)inti,j,bSIZE;for(i=1;i=p;i+)b(1)=ai;/(2分)for(i=p+1;i=n;i+)bi-p=ai;for(i=1;i=n;i+)ai=bi;事实上,还有一种更好的算法,时间复杂度为 O(n)、空间复杂度为 O(1):voidswap2(intp)inti,j,temp;for(i=p+1;i=(2)j-) /(2分)aj=aj-1; (3)=temp; /(2分)事实上,还有一种更好的算法,时间复杂度为O(n)、空间复杂度为O(1):voidswap3(intp)intstart1,end1,start2,end2,i,j,temp;star
16、t1=1;end1=p;start2=p+1;end2=n;while(true)i=start1;j=start2;while(i=end1)&(j=end2)temp=ai;ai=aj;aj=temp;i+;j+;if(i=end1)start1=i;elseif(4) /(3分)start1=(5) /(3分)end1=(6) /(3分)start2=j;elsebreak;2. (两元序列)试求一个整数序列中,最长的仅包含两个不同整数的连续子序列。如有多 个子序列并列最长,输出任意一个即可。例如,序列“1 1 2 3 2 3 2 3 3 1 1 1 3 1”中, 有两段满足条件的最长子
17、序列,长度均为 7,分别用下划线和上划线标出。#includeintmain()constintSIZE=100;intn,i,j,aSIZE,cur1,cur2,count1,count2,ans_length,ans_start,ans_end;/cur1,cur2分别表示当前子序列中的两个不同整数/count1,count2分别表示cur1,cur2在当前子序列中出现的次数scanf(%d,&n);for(i=1;i=n;i+)scanf(%d,&ai);i=1;j=1;/i,j分别表示当前子序列的首尾,并保证其中至多有两个不同整数while(j=n)&(aj=ai)j+; cur1=a
18、i;cur2=aj; count1=(1)/(3分)count2=1;ans_length=j-i+1;while(j0)if(ai=cur1)count1-;elsecount2-;i+;cur2=aj;count2=1;elsewhile(count10)if(ai=cur1)(3)/(2分)else(4) /(2分)i+;(5) /(3分)count1=1;if(ans_lengthj-i+1)ans_length=j-i+1;ans_start=i;ans_end=j;for(i=ans_start;i1)四、阅读程序题()Yes判定输入的字符串是否是回文串()133到1000中是或的倍数的数的个数()4最长上升子序列的长度()7图中最长通路的长度五、完成程序题.(1) n+i-p(2) i+1-p(3) ai-p(4) j=end2 (5) i(6) J-1(或start2-1)、(1)j-1(2) cur1(3) dec(count1)(4) dec(count2)(5) cur1:=aj