1、完整wordNOIP初赛提高组试题解析19.2 十九届提高组一、单项选择题(共15题,每题1.5分,共计22.5分;每题有且仅有一个正确选项)1一个32位整型变量占用( A )个字节。A4 B8 C32 D1282二进制数11.01在十进制下是( A )。A3.25 B4.125 C6.25 D11.1253下面的故事与( B )算法有着异曲同工之妙。从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事”A枚举 B递归 C贪心 D分治41948年,( D )将热力学中的熵引入信息
2、通信领域,标志着信息论研究的开端。A冯诺伊曼(John von Neumann) B图灵(Alan Turing)C欧拉(Leonhard Euler) D克劳德香农(Claude Shannon)【分析】 香农信息论鼻祖5已知一棵二叉树有2013个节点,则其中至多有( A )个节点有2个子节点。A1006 B1007 C1023 D1024【分析】(1)树根深度为0,深度为10的满二叉树节点总数2047; (2)本题树深为10的完全二叉树,与满二叉树相比少了34个节点,(3)深度为9的满二叉树节点总数量为1023;(4)1023-(34/2)=10066在一个有向图中,如果任意两点之间都存在
3、路径相连,则称其为连通图。右图是一个有5个顶点、8条边的连通图。若要使它不再是连通图,至少要删去其中的( B )条边。A2 B3 C4 D5【分析】要使图不联通,只要其中某一个节点不连通即可,所有顶点度最少是3,所以最少需要删除3条边7斐波那契数列的定义如下:F1=1,F2=1,Fn=Fn-1+Fn-2(n3)。如果用下面的函数计算斐波那契数列的第n项,则其时间复杂度为( D )。function F(n:longint):longint;begin if n=2 then F:=1 else F:=F(n-1)+F(n-2);end;AO(1) BO(n) CO(n2) DO(Fn)【分析】
4、计算F1需要1次,计算F2需要一次,计算Fn需要计算F(n-1)的次数加上F(n-2)的次数,所以其实就是计算Fn次,于是答案选择D,至于这个Fn到底是多大,数学上可以计算,它等于O((1+sqrt(5))/2)n).8二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于其右子树上所有节点的值。那么,二叉查找树的( B )是一个有序序列。A先序遍历 B中序遍历 C后序遍历 D宽度优先遍历9将(2,6,10,17)分别存储到某个地址区间为010的哈希表中,如果哈希函数h(x)=( D ),将不会产生冲突,其中a mod b表示a除以b的余数。Ax mod 11 Bx2 mod
5、11C2x mod 11 Dmod 11,其中表示下取整【分析】A项6和17对11取余都是6发生冲突,B项10的平方和17的平方对11取余都是1发生冲突,C项6的两倍和17的两倍对11取余都是1发生冲突,D项分别为1,2,3,4,不冲突10IPv4协议使用32位地址,随着其不断被分配,地址资源日趋枯竭。因此,它正逐渐被使用( D )位地址的IPv6协议所取代。A40 B48 C64 D12811二分图是指能将顶点划分成两个部分,每一部分内的顶点间没有边相连的简单无向图。那么12个顶点的二分图至多有( C )条边。A18 B24 C36 D66【分析】二分为6个和6个的顶点,此时边最多,有36条
6、边。12( B )是一种通用的字符编码,它为世界上绝大部分语言设定了统一并且唯一的二进制编码,以满足跨语言、跨平台的文本交换。目前它已经收录了超过十万个不同字符。AASCII BUnicode CGBK2312 DBIG5【分析】UNICODE与ASCII的区别 .1.ASCII的特点(1)ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00HFFH)。这对于英文而言,是没有问题的,一般只什么用到前128个(00H-7FH,最高位为0)。而最高位为1 的另128 个字符(80HFFH)被称为“扩展ASCII”,
7、一般用来存放英文的制表符、部分音标字符等等的一些其它符号。(2)但是对于中文等比较复杂的语言,255个字符显然不够用。于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB231280”, 它是和ASCII 兼容的一种编码规范, 其实就是利用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII 字符来表示,以区分ASCII 码部分。 但是这个方法有问题,最大的问题就是中文的文字编码和扩展ASCII 码有重叠。而很多软件利用扩展ASCII 码的英文制表符来画表格,这样的软件用到中文系统中,这些表格就会被误认作中文字符,出现乱码。另外,由于各国和各地区都有自
8、己的文字编码规则,它们互相冲突,这给各国和各地区交换信息带来了很大的麻烦。2.UNICODE的产生(1)要真正解决这个问题,不能从扩展ASCII 的角度入手,UNICODE作为一个全新的编码系统应运而生,它可以将中文、法文、德文等等所有的文字统一起来考虑,为每一个文字都分配一个单独的编码。3.什么是UNICODEUnicode与ASCII一样也是一种字符编码方法,它占用两个字节(0000HFFFFH),容纳65536 个字符,这完全可以容纳全世界所有语言文字的编码。在Unicode 里,所有的字符都按一个字符来处理, 它们都有一个唯一的Unicode 码。13把64位非零浮点数强制转换成32位
9、浮点数后,不可能( D )。A大于原数 B小于原数 C等于原数 D与原数符号相反【分析】64位非零浮点数强制转换成32位浮点数,两个数会有大小上的细微差别,但不会发生符号变化,因为有专门的符号位14对一个n个顶点、m条边的带权有向简单图用Dijkstr算法计算单源最短路时,如果不使用堆或其它优先队列进行优化,则其时间复杂度为( B )。AO(mn+n3) BO(n2) CO(m+n)log n) DO(m+n2)log n)【分析】Dijkstra算法(双重for 循环)计算单源最短路时间复杂度如果不借助堆或优先队列优化,是O(n2).15T(n)表示某个算法输入规模为n时的运算次数。如果T(
10、1)为常数,且有递归式T(n)=2*T(n / 2)+2n,那么T(n) = ( B )。A(n) B(n log n) C(n2) D(n2log n)【分析】的含义和“等于”类似,而大O的含义和“小于等于”类似设 N(1 / 2) X=1 ,X=log2NT(n)=2*T(n / 2)+2n=2(2(T(n / 4)+2(n / 2)+2n=22T(n / 4)+(2n) 2=2XT(1)+(2n) X =2 log2N T(1)+(2N) log2N =N +(2N) log2N= O(N log2N)二、不定项选择题(共5题,每题1.5分,共计7.5分;每题有一个或多个正确选项,多选或
11、少选均不得分)1下列程序中,正确计算1,2,100这100个自然数之和sum(初始值为0)的是( AC )。2( AD )的平均时间复杂度为O(n log n),其中n是待排序的元素个数。A快速排序 B插入排序 C冒泡排序 D归并排序【分析】只有快速排序和归并排序是n log n的,冒泡和插入都是n2的时间复杂度。3以A0作为起点,对下面的无向图进行深度优先遍历时(遍历的顺序与顶点字母的下标无关),最后一个遍历到的顶点可能是( CD )。AA1 BA2 CA3 DA44( AB )属于NP类问题。A存在一个P类问题 B任何一个P类问题C任何一个不属于P类的问题 D任何一个在(输入规模的)指数时
12、间内能够解决的问题【分析】1. 时间复杂度:(1)时间复杂度:是指执行算法所需要的计算工作量。 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。 (2)多项式时间算法:如果一个算法,它能在以输入规模为参变量的某个多项式的时间内给出答案,则称它为多项式时间算法。2. P类、NP类问题(1)P类问题的概念:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。 (2)NP类问题:NP(Non-deterministic Polynomial)问题是指可以在多项式的时间里验证一个解的问题。NP问题的另一个定义是,可
13、以在多项式的时间里猜出一个解的问题。 (3)所有的P类问题都是NP问题。 NP问题不是非P类问题3. NPC问题(NP完全问题):Cook 在1971年给出并证明了有一类问题具有下述性质:(1)这类问题中任何一个问题至今未找到多项式时间算法;(2)如果这类问题中存在一个问题有多项式时间算法,则这类问题都有多项式时间算法这类问题就是所谓的NP完全问题。 (3)NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;然后,所有的NP问题都可以约化到它。5CCF NOIP复赛考试结束后,因( ABCD )提出的申诉将不会被受理。A源程序文件名大小写错误B源程序保
14、存在指定文件夹以外的位置C输出文件的文件名错误D只提交了可执行文件,未提交源程序三、问题求解(共2题,每题5分,共计10分;每题全部答对得5分,没有部分分)1 某系统自称使用了一种防窃听的方式验证用户密码。密码是n个数s1,s2,sn,均为0或1。该系统每次随机生成n个数a1,a2,an,均为0或1,请用户回答(s1a1+s2a2+snan)除以2的余数。如果多次的回答总是正确,即认为掌握密码。该系统认为,即使问答的过程被泄露,也无助于破解密码因为用户并没有直接发送密码。然而,事与愿违。例如,当n=4时,有人窃听了以下5次问答:就破解出了密码s1= 0 ,s2= 1 ,s3= 1 ,s4= 1
15、 。【分析】(1)由第5组得到s1=0;(2)由第1组、第5组得到s2=1;(3)由第1组、第3组得到s3=1;(3)由第2组、第3组得到s4=1;2 现有一只青蛙,初始时在n号荷叶上。当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,k号荷尔蒙叶之一上,直至跳到1号荷叶为止。当n=2时,平均一共跳2次;当n=3时,平均一共跳2.5次。则当n=5时,平均一共跳 37/12 次。【分析递推】(1)由n=2时,跳法22,21共2次,平均跳的次数f2=2次,说明在求平均时编号1不统计在内。(2)由n=3时,跳法33,32,31,再从2号跳跳法22,21共5次,平均跳的次数f3=2.5次;
16、f3=(3+f2)/2=2.5(3)由n=4时,跳法分别是落在1号、2号、3号、4号;平均跳的次数f4=(4+f2+f3)/3=(4+2+2.5)/3 = 8.5/3(4)由n=5时,跳法分别是落在1号、2号、3号、4号、5号;平均跳的次数f5=(5+f2+f3+f4)/4=(5+2+2.5+8.5/3)/4= 37/12四、阅读程序写结果(共4题,每题8分,共计32分)1【字符串判定输入的字符串是否是回文串】varn,i:integer;str:string;isPlalindrome:Boolean;begin readln(str); n:=Length(str); isPlalindr
17、ome:=true; for i:=1 to (n idv 2) do begin if (stristrn-i+1) then isPlalindrome:=false; end; if (isPlalindrome) then writeln(Yes) else writeln(No);end.输入:abceecba输出: Yes 【分析】 str1str8、str2str7 、 str3str6 、str4str5这4对字符相同则返回true2【数学到1000中是或的倍数的数的个数】Var a,b,u,v,I,num:integer;begin readln(a,b,u,v);num:=
18、0;for i:=a to b dobegin if (I mod u=0)or(I mod v=0) then inc(num);end;writeln(num);end.输入:1 1000 10 15输出: 133 【分析】此题计数1-1000范围内能够整除10或15的数有多少个,使用容斥原理或者集合求并很容易可以得到1000/10+1000/15-1000/30=133.3【动态规划最长上升子序列的长度】const SIZE=100;var n,ans,I,j:integer;height,num:array1.SIZE of integer; begin read(n); for i:
19、=1 to n do begin read(heighti); numi:=1; for j:=1 to i-1 do beginif (heightj=numi) then numi:=numj+1; end;end; ans:=0; for i:=1 to n do begin if (numians) then ans:=ans+numi; end; writeln(ans);end.输入:83 2 5 11 12 7 4 10输出: 4 【分析】【1.状态描述】 (1)heighti存放的数组(2)numi:数组height1heighti中中包含heighti上升序列长度【2.状态转
20、移】 1. 初始状态:numi:=1; num1:=1; 2. 状态转移:从下标1逐步递推到n,求解numi numi=Max numj, (1= j= i-1, heightj height3=5,num4= num3+1=3【4.算法设计】 1. 初始状态:numi:=1; num1:=1; 求解numi的最优解2. 状态前驱: numi的前驱状态numj:num1 numi-13. 状态转移: (1)条件:if (heightj=numi) (2)转移方程:numi:=numj+1;4【深度优先搜索上下左右找棋盘数字为0的连续单元格数量】const SIZE=100;var n,m,p,
21、count,ans,x,y,I,j:integer;a:array1.SIZE,1.SIZE of integer;procedure colour(x,y:integer);begin inc(count); axy:=1; if (x1)and(ax-1y=0) then colour(x-1,y); /上 if (y1)and(axy-1=0) then colour(x,y-1); /左 if (xn)and(ax+1y=0) then colour(x+1,y); /下 if (ym)and(axy+1=0) then colour(x,y+1); /右end;begin fillc
22、har(a,sizeof(a),0); readln(n,m,p); for i:=1 to p do begin read(x,y); axy:=1; end; ans:=0; for i:=1 to n dofor j:=1 to m do if aij=0 then begincount:=0; colour(i,j); if (anscount) then ans:=count; end; writeln(ans);end.输入:6 5 91 42 32 43 24 14 34 55 46 4输出: 7 【分析】【1.状态描述】 (1)棋盘状态:axy:=1或0(2)count,ans
23、:数字为0的连续单元格数量,count当前解,ans当前最优解【2.状态转移】 1. 初始状态:查找棋盘每个值为0的单元格 aij=0 2. 状态转移:如果aij=0则 (1):状态修改 inc(count); aij:=1;(2):按上下左右4个方向深度搜索下一单元格【3.算法分析】分上下左右找数字为0的连续单元格数量【4.算法设计】 1. 初始状态:查找棋盘每个值为0的单元格 ,并以它为起点查找数字为0的连续单元格数量count,初始count:=02. 父状态axy=0 procedure colour(x,y:integer);begin 1. 计算新状态:inc(count); 2.
24、 父状态访问过标志:axy:=1; 3. 试探各种子状态可能按上下左右4个方向深度搜索下一单元格 4. 下一单元格值为0,则深度搜索colour(x-1,y) end;五、完善程序(第1题15分,第2题13分,共计28分)1(序列重排)全局数组变量a定义如下:const int SIZE=100;int aSIZE,n;它记录着一个长度为n的序列a1,a2,an。现在需要一个函数,以整数p(1pn)为参数,实现如下功能:将序列a的前p个数与后n-p个数对调,且不改变这p个数(或n-p个数)之间的相对位置。例如,长度为5的序列1,2,3,4,5,当p=2时重排结果为3,4,5,1,2。有一种朴素
25、的算法可以实现这一需求,其时间复杂度为O(n)、空间复杂度为O(n):procedure swap1(p:longint);var I,j:longint; b:array1.SIZE of longint;begin for i:=1 to p do b(1) n-p+i :=ai; /(2分) for i:=p+1 to n do bi-p:=ai; for i:=1 to n do ai:=bi;end;【分析】【算法设计】1. 第一种方法是通过开一个b数组,然后先将a数组中1到p的数复制到b数组中后p个位置:n-p+1到n。2. 将a数组p+1到n区间的数复制到b数组前段1n-p。3.
26、 最后再将b数组元素复制回a数组中;显然第一空是n-p+i。以p=3为例我们也可以用时间换空间,使用时间复杂度为O(n2)、空间复杂度为O(1)的算法:procedure swap2(p:longint);var I,j,temp:longint;begin for i:=p+1 to n do begintemp:=ai;for j:=I downto (2) i+1-p do aj:=aj-1; /(2分) (3) ai-p :=temp; /(2分) end;end;【分析】【1.算法分析】前P个数逐渐往后移动【2.算法设计】1.初始状态:将第p+1位置空出temp:=ai;,将前p个数
27、后移 2.空出位置i从p+1一直到n,移动的数就是i左边的p个数 3.将空出位置i原来的数temp放到i的前面空出的位置i-pai-p:=temp;事实上,还有一种更好的算法,时间复杂度为O(n)、空间复杂度为O(1);procedure swap3(p:longint);var start1,end1,start2,end2,I,j,temp:longint;begin start1:=1; end1:=p; start2:=p+1; end2:=n; while true do begin i:=star1; j:=start2; while (i=end1)and(j=end2) do begin temp:=ai; ai:=aj; aj:=temp; inc(i); inc(j);end;if i=end1 then start1:=ielse if (4) jend1) and( jend2) then 则交换的两段需要进行调整 (1)第一段start1、end1右移,应该在当前i、j之间: start1:=i ; end1:=J-1 (2)第二段start2右移、end2不变 start2:=j; 3. 状态转移2:第二段数组全部交换
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1