noip初赛解析.docx
《noip初赛解析.docx》由会员分享,可在线阅读,更多相关《noip初赛解析.docx(16页珍藏版)》请在冰豆网上搜索。
noip初赛解析
分区联赛(NOIP2010)初赛模拟试卷
(PASCAL2个小时满分100分)
一、单项选择题(每题5个选项中只有一个正确答案,1.5分/题*10题=15分)
1.以下各项中,(D)不是CPU的组成部分。
A.控制器B.运算器C.寄存器D.主板E.算术逻辑单元(ALU)
2.在关系数据库中,存放在数据库中的数据的逻辑结构以(E)为主。
A.二叉树B.多叉树C.哈希表D.B+树E.二维表
HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值.也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
基本概念
*若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。
由此,不需比较便可直接取得所查记录。
称这个对应关系f为散列函数(Hashfunction),按这个思想建立的表为散列表。
*对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。
具有相同函数值的关键字对该散列函数来说称做同义词。
综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
*若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(UniformHashfunction),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
B树,其定义如下:
一棵m阶的B-树满足下列条件:
⑴树中每个结点至多有m个孩子;
⑵除根结点和叶子结点外,其它每个结点至少有m/2个孩子;
⑶若根结点不是叶子结点,则至少有2个孩子;
⑷所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息;
⑸有k个孩子的非终端结点恰好包含有k-1个关键字。
B+树可以看作是B树的变形,对于存放在外存贮器上的字典,B+树比B树更为常用。
一个m阶的B+树满足下列条件∶
(1)每个结点至多有m棵子树。
(2)除根结点外,其它每个分支至少有m/2棵子树。
(3)非叶结点的根结点至少有两棵子树。
(4)有n棵子树的结点有n个关键码,叶结点中至少包含n/2个关键码。
(5)叶结点都在同一层中,其中存放数据文件中记录的关键码及指向该记录的指针,或存放数据文件分块后每块的最大关键码及指向该块的指针。
叶结点按关键码值大小顺序链接。
可以把每个叶结点看成是一个基本索引块(直接指向数据文件中的记录)。
(6)所有分支结点可看成是索引的索引。
使结点中仅包含它的各个子结点中最大(或最小)关键码的分界值及指向子结点的指针。
3.在下列各项中,只有(D)不是计算机存储容量的常用单位。
A.ByteB.KBC.MBD.UBE.TB
4.在Pascal语言中,表达式(23or2xor5)的值是(A)。
A.18B.1C.23D.32E.24
Xor异或
10111or10=10111
10111xor101=10010
5.在Pascal语言中,判断整数a等于0或b等于0或c等于0的正确的条件表达式是(B)。
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))
2007
6.地面上有标号为A、B、C的3根细柱,在A柱上放有10个直径相同中间有孔的圆盘,从上到下依次编号为1,2,3,……,将A柱上的部分盘子经过B柱移入C柱,也可以在B柱上暂存。
如果B柱上的操作记录为:
“进,进,出,进,进,出,出,进,进,出,进,出,出”。
那么,在C柱上,从下到上的盘子的编号为(D)。
A.243657B.241257C.243176D.243675E.214375
2007
7.用递归算法实现n个相异元素构成的有序序列的二分查找,采用一个递归工作栈时,该栈的最小容量应(以下[x]表示取整操作)为(D)。
A.nB.[n/2]C.[Log2n]D.[Log2(n+1)]E.[n/2]+1
二分查找又称折半查找
算法思想:
首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
8.对于以下一组关键字(12,2,16,30,8,28,4,10,20,6,18),按照快速排序算法(选第一个记录为基准元素)进行递增排序,第一趟排序后得到的结果为(B)。
A.10,6,18,8,4,2,12,20,16,30,28B.6,2,10,4,8,12,28,30,20,16,18
C.2,4,6,8,10,12,16,18,20,28,30D.6,10,8,28,20,18,2,4,12,30,16
E.6,10,8,20,28,18,2,4,12,30,16
12的左小于,右大于。
9.假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为(B)。
A.ABCDEFGHIJB.ABDEGHJCFIC.ABDEGHJFICD.ABDEGJHCFIE.ABDEGHIJCF
后序遍历序列最后A为根结点
中序遍历序列中DBGEHJ为A的左结点,CIF为A的右结点
DGJHEB后序遍历序列最后B。
。
。
。
。
。
10.已知一个线性表(38,25,74,63,52,48),采用的散列函数为H(Key)=Keymod7,将元素散列到表长为7的哈希表中存储,若利用拉链法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为(C)。
A.1.0B.7/6C.4/3D.3/2E.5/4
拉链法
拉链法解决冲突的方法
拉链法解决冲突的做法是:
将所有关键字为同义词的结点链接在同一个单链表中。
若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。
凡是散列地址为i的结点,均插入到以t为头指针的单链表中。
t中各分量的初值均应为空指针。
3852
2574
63
48
1+2+1+2+1+1=8/6=4/3
二、不定项选择题(每题至少有一个正确答案,少选漏选多选均不得分,1.5分/题*10题=15分)
11.欧拉图G是指可以构成一个闭回路的图,且图G的每一条边恰好在这个闭回路上出现一次(即一笔画成)。
在以下各个描述中,不一定是欧拉图的是(D)。
A.图G中没有度为奇数的顶点
B.包含欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径)
C.包含欧拉闭迹的图(欧拉迹是指通过图中每边恰好一次的路径)
D.存在一条回路,通过每个顶点恰好一次
12.设A=B=D=true,C=E=false,以下逻辑运算表达式值为真的有(ABC)。
A.(A∧B)∨(C∧D)∨¬EB.¬(((A∧B)∨C)∧D∧E)
C.A∧(B∨C∨D∨E)D.(A∧(B∨C))∧D∧E
2007
13.(2010)16+(32)8的结果等于(AB)。
A.(8234)10B.(202A)16C.(100000000110)2D.(2042)16
14.下列各数据库系统软件中,以关系型数据库为主体结构的有哪些(ABCD)。
A.ACCESSB.SQLServerC.OracleD.Foxpro
15.一个无法靠自身的控制终止的循环称为“死循环”。
例如,在Pascal语言程序中,语句“while1=1dowrite(“*”);”就是一个死循环,运行时它将无休止地打印*号。
下面关于死循环的说法中,哪些是正确的(A)。
A.不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,
任何编译系统都不做死循环检验
B.有些编译系统可以检测出死循环
C.死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
D.死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而死循环也是可以检测的
2007
16.下列关于计算机算法的说法中,正确的有(BD)。
A.一个正确的算法至少要有一个输入
B.算法的改进,在很大程度上推动了计算机科学与技术的进步
C.判断一个算法的好坏,主要依据它在某台计算机上具体实现时的运行时间
D.目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法
17.面向对象程序设计是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。
关于面向对象程序设计的说法中,正确的有(BCD)。
A.面向对象程序设计通常采用自顶向下设计方法进行设计。
B.面向对象程序设计方法具有继承性、封装性、多态性等几大特点。
C.支持面向对象特性的语言称为面向对象的编程语言,目前较为流行的有C++、JAVA、C#等。
D.面向对象程序设计的雏形来自Simula语言,后来在SmallTalk语言的完善和标准化过程中得到更多的扩展和对以前思想的重新注解。
至今,SmallTalk语言仍然被视为面向对象语言的基础。
18.设T是一棵有n个结点的树,下列说法正确的有(ABC)。
A.T是连通的、无环的B.T是连通的,有n-1条边
C.T是无环的,有n-1条边D.以上都不对
19.有关防火墙(firewall)的说法,正确的有(ABCD)。
A.防火墙是一项协助确保信息安全的设备,其会依照特定的规则,允许或是限制数据通过
B.防火墙可能是一台专属的硬件或是安装在一般硬件上的一套软件
C.网络层防火墙可以视为一种IP数据包过滤器,只允许符合特定规则的数据包通过,其余的一概禁止穿越防火墙
D.应用层防火墙是在TCP/IP的“应用层”上工作,可以拦截进出某应用程序的所有数据包
20.Web2.0是近年来互联网的热门概念之一,其核心思想是互动与分享。
下列网站中哪些是典型的Web2.0应用(B)。
A.SinaB.FlickC.YahooD.Google
三、问题求解(4分/题*3题=12分,每题答案完全正确得4分,否则0分)
1、有3堆火柴共48根,现在从第1堆里拿出与第2堆根数相同的火柴并入第2堆,再从第2堆里拿出与第3堆根数相同的火柴并入第3堆,最后再从第3堆里拿出与此时第1堆根数相同的火柴并入第1堆,经过这样的变动后3堆火柴的根数正好一样。
问:
原来每堆火柴各有多少根?
第1、2、3堆分别有22、14、12根。
XYZ
1X-Y2Y
2X-Y2Y-Z2Z
32(X-Y)2Z-(X-Y)
2(X-Y)=2Y-Z=2Z-(X-Y)
X+Y+Z=48
2、一棵二叉树的先序、中序和后序遍历顺序的一部分如下所示,请画出该二叉树。
先序:
__B__F__ICEH__G
中序:
D__KFIA__EJC__
后序:
__K__FBHJ__G__A
3、对下面的递归算法要求写出调用p(4)的运行结果。
procedurep(w:
integer);
begin
ifw>0thenbegin
write(w);
p(w-1);
p(w-1);
end
end;
432112113211211
四、读程序写结果(7分/题*4题=28分,每题结果完全正确得7分,否则0分)
1、programt1;
constn=10;
a:
array[1..n]oflongint=(8,19,24,33,46,54,67,76,81,92);
vari,j,s:
longint;
begin
s:
=0;
fori:
=1tondo
forj:
=itondos:
=s+a[i]*a[j];
writeln(s);
end.
输出:
141206
2、programt2;
vari,j,k,n,s:
longint;
begin
n:
=16;s:
=0;
fori:
=1tondiv2do
begin
k:
=1;
forj:
=i+1tondok:
=k*jdiv(j-i);
s:
=s+k
end;
writeln(s)
end.
输出:
39202
3、programt3;
varn:
longint;
proceduret(n:
longint);
begin
ifn<>0then
begin
t(ndiv(-8));
write(nmod(-8):
3)
end
end;
begin
n:
=622;
t(n);
writeln;
n:
=-622;
t(n);
writeln
end.
输出:
-11-56
1-15-6
4、programt4;
constmaxn=15;
typearraytype=array[1..maxn*maxn,1..maxn*maxn]ofbyte;
vard,i,j,k,m,n,mind,nextp,t:
longint;
p:
array[1..maxn*maxn,1..2]oflongint;
g:
arraytype;
r:
array[1..maxn,1..maxn]oflongint;
v:
array[1..maxn*maxn]oflongint;
proceduredfs(k:
longint);
vari:
longint;
begin
ifv[k]=0then
begin
inc(t);
r[p[k,1],p[k,2]]:
=t;
v[k]:
=1;
fori:
=1ton*ndo
ifg[k,i]=1thendfs(i)
end
end;
begin
n:
=4;k:
=0;
fori:
=1tondo
forj:
=1tondo
begin
inc(k);p[k,1]:
=i;p[k,2]:
=j
end;
fillchar(g,sizeof(g),0);
fori:
=1ton*n-1do
forj:
=i+1ton*ndo
ifabs((p[i,1]-p[j,1])*(p[i,2]-p[j,2]))=2
thenbeging[i,j]:
=1;g[j,i]:
=1end;
fillchar(v,sizeof(v),0);
t:
=0;
dfs
(1);
fori:
=1tondo
begin
forj:
=1tondowrite(r[i,j]:
4);
writeln
end;
end.
输出:
14710
81125
36912
14131516
五、完善程序(3分/空*10空=30分)
1、最小的0、1数字串
[问题描述]
给定一个位数小于5的正整数N,编程求出最小正整数M,使N×M的各位数字均为0或1。
例如,当N=6时,M=185,N×M=1110。
[问题输入]
输入文件名为str.in,仅一行,包含一个正整数N。
[问题输出]
输出文件为str.out,也只有一行,共有三个正整数,其中第一个数为N的值,第二个数为M的值,第3个数为M×N的值。
每两个相邻数之间严格以一个空格作为分隔。
[输入样例]
6
[输出样例]
61851110
[问题分析]
首先想到的是穷举二进制01串,但这样做肯定会超时,因为复杂度是2的幂次,幂次为要求的最小01串的位数,如果01串的位数较大,还要用精度运算来处理。
正确的方法是根据二进制01串(作为十进制数运算)除以n的余数进行递推,因为如个两个位数相同的01串除以n的余数相同的话,则在它们的最高位之前再加个1之后,两个新的01串除以n的余数仍然相同,而题目要求能被n整除的取小的01串,显然当两个不同的01串除以n的余数相同时,只需记录值较小的那个01串。
以n=6为例,0,1除以6的余数乃为0,1,在0之前加1得到10,10除以6的余数为4,在1之前加1得到11,11除以6的余数为5,然后再在00,01,10,11之前加1得到三位0,1串100,101,110,111,100除以6的余数与10除以6的余数同为4,则无须记录,同样地101除以6的余数与11除以6的余数同为5也无须记录,110除以6的余数为2,111除以6的余数为3,断续下去可推得四位的0,1串1000,1001,1010,1011除以6的余数均已在前面出现过,只有1110能被6整除,余数为零为问题的解。
在递推过程中对余数相同的01串只记录值最小的一个,所以象1100这样的01串就不会被处理到,因为1100是在100之前加上1得到的,而100在之前因为除以6的余数与10除以6的余数相同,没有记录下来,这样做会不会影响问题的解呢?
答案是肯定不会,因为在010之前加上1得到的1010与1100一定有同样的余数,所以记录了1010就不需要考虑1100了。
因为余数不会超过n,程序中要记录的01串当然不会超过n个,所以该算法的复杂度=要求的最小01串的位数*n。
再利用mod运算的下列两个性质:
(a*b)modn=(amodn)*(bmodn),10^kmodn=(...(((10modn)*10)modn)*10...)mod10,高精度运算就可以避免了,实际上由于每一个01串都是通过在另一个串的头上添加1得到,所以我们可以将这样的一对01串看作父子关系,可用类似宽度优先的方法记录父结点,再记录下当前的01串的位数就可以了。
[参考程序]
constmaxn=10000;
vari,k,n,len,r,tempf,templ,x:
longint;
firstz:
boolean;
long:
array[0..maxn]ofinteger;
father:
array[0..maxn]ofinteger;
begin
assign(input,'str.in');reset(input);
assign(output,'str.out');rewrite(output);
readln(n);close(input);
ifn=1thenbeginwriteln(1,'',1,'',1);close(output);haltend;
fillchar(long,sizeof(long),0);
fillchar(father,sizeof(father),0);
long[0]:
=0;long[1]:
=1;father[1]:
=0;
r:
=1;len:
=1;
while1long[0]=0do
begin
r:
=r*10modn;
len:
=len+1;
fori:
=0ton-1do
if2(i=0)or(long[i]>0)and(long[i]begin
k:
=i+r;
ifk>=nthenk:
=k-n;
iflong[k]=0thenbeginlong[k]:
=len;3father[k]:
=Iend
end;
end;
write(n,'');
k:
=father[0];tempf:
=k;templ:
=len;father[0]:
=-1;long[0]:
=0;r:
=0;firstz:
=true;
whilek>=0do
begin
r:
=r*10+1;
ifrdivn>0thenbeginwrite(rdivn);firstz:
=falseend;
if(rdivn=0)and(notfirstz)thenwrite(0);
r:
=rmodn;
fori:
=len-1downto4long[k]+1do
begin
r:
=r*10;
ifrdivn>0thenbeginwrite(rdivn);firstz:
=falseend;
if(rdivn=0)and(notfirstz)thenwrite(0);
r:
=rmodn;
end;
5len:
=long[k];
k:
=father[k];
end;
write('');
k:
=tempf;len:
=templ;
father[0]:
=-1;long[0]:
=0;
whilek>=0do
begin
write
(1);
fori:
=len-1downtolong[k]+1dowrite(0);
len:
=long[k];
k:
=father[k];
end;
writeln;close(output)
end.
2、排序
[问题描述]
编写一个程序,对其从键盘输入N(1<=N<=9),输出一个包含Pascal过程ProcedureEasySort的文件EasySort.pas,使得EasySort具有对读入的N个整数(均在integer范围内)进行从小到大排序输出的功能。
EasySort中只能有if,readln,writeln语句。
变量名应依次声明为a,b,c,……;不能有冗余判断,例如,在判明a
[输入样例]
3
[输出样例]
procedureEasySort;
vara,b,c:
integer;
begin
readln(a,b,c);
ifaifbelseifaelsewriteln(c,'',a,'',b)
elseifaelseifb