18届全国青少年信息学奥林匹克联赛初赛详解普及组.docx
《18届全国青少年信息学奥林匹克联赛初赛详解普及组.docx》由会员分享,可在线阅读,更多相关《18届全国青少年信息学奥林匹克联赛初赛详解普及组.docx(20页珍藏版)》请在冰豆网上搜索。
18届全国青少年信息学奥林匹克联赛初赛详解普及组
第十八届全国青少年信息学奥林匹克联赛初赛
(普及组Pascal语言试题)
竞赛时间:
2012年10月13日14:
30~16:
30
选手注意
·试题纸共有10页,答题纸共有2页,满分100分。
请在答题纸上作答,写在试题纸上一律无效。
·不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料
一、单项选择题(共20题,每题1.5分,共计30分;每题且仅有一个正确选项)
1.计算机如果缺少(A),将无法正常启动。
A.内存B.鼠标C.U盘D.摄像头
2.(B)是一种先进先出的线性表。
A.栈B.队列C.哈希表(散列表)D.二叉树
解析:
1.栈的定义(可参考:
栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(LastInFirstOut)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。
每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
2.队列:
定义:
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
(1)允许删除的一端称为队头(Front)。
(2)允许插入的一端称为队尾(Rear)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(FirstInFirstOut)的线性表,简称为FIFO表。
队列的修改是依先进先出的原则进行的。
新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。
【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。
退出队列的次序只能是a1,a2,…,an。
3.哈希表(散列表)
散列方法是使用函数h将U映射到表T[0..m-1]的下标上(m=O(|U|))。
这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。
从而达到在O
(1)时间内就可完成查找。
哈希表存在散列表的冲突现象:
两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。
该现象称为冲突(Collision)或碰撞。
发生冲突的两个关键字称为该散列函数的同义词(Synonym)。
【例】上图中的k2≠k5,但h(k2)=h(k5),故k2和K5所在的结点的存储地址相同。
----------------------------------------
4.在计算机科学中,二叉树是每个结点最多有两个子树的有序树。
通常根的子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree),次序不能颠倒。
·二叉树的5种形态:
·二叉树的遍历:
3.目前计算机芯片(集成电路)制造的主要原料是(A),它是一种可以在沙子中提炼出的物质。
A.硅B.铜C.锗D.铝
4.十六进制数9A在(B)进制下是232.
A.四B.八C.十D.十二
解析:
9A十六,先转化成十进制=9*162-1+10*161-1十进制=154十进制,再转化成二进制=10011010二进制=10011010(从最右边起三个一组,分别转换成十进制数字,就得到八进制表示的数)=232八进制
注:
十进制,八进制和十六进制互化应以二进制作为桥梁,将二进制转化成16或8进制:
以小数点为界分别向左右每4(或3)个数字为一组进行分组,每组分别转化成二进制数,最后合并在一起,并把首0去掉(尾0不可以去)。
如:
(001101001)2=(151)8(00010110.01011011)2=(16.5B)16
5.(C)不属于操作系统。
A.WindowsB.DOSC.PhotoshopD.NOILinux
6.如果一棵二叉树的中序遍历是BAC,那么它的先序遍历不可能是(C)。
解析:
从题目“中序遍历是BAC”得知:
还原此二叉树可能是以下几种情况:
A.ABC+中序遍历是BAC,还原得到:
B.CBA+中序遍历是BAC,还原得到:
C.ACB还原得到:
这两个树的中序遍历都不是BAC。
D.BAC中序遍历是BAC,还原得到:
前序:
先根节点,然后遍历左子树,最后遍历右子树,根-左-右。
中序:
先遍历左子树,再是根节点,最后遍历右子树,左-根-右
后序:
先遍历左子树,再遍历右子树,最后是根节点,左-右-根
在每个左右子树也遵守以上各自规则!
7.目前个人电脑的(B)市场占有率最靠前的厂商包括Intel、AMD等公司。
A.显示器:
三星,LG,戴尔,宏碁,HP……
B.CPU:
INTEL,AMD,台湾VIA威盛......
C.内存:
金士顿Kingston,威刚,海盗船等
D.鼠标:
双飞燕雷柏(Rapoo)罗技(Logitech)大水牛......
8.使用冒泡排序对序列进行升序排列,每执行一次交换操作系统将会减少1个逆序对,因此序列:
5,4,3,2,1需要执行(C)次操作,才能完成冒泡排序。
A.0B.5C.10D.15
冒泡排序(BubbleSort)的基本概念是:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:
首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
在第二趟:
仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
此题答案:
冒泡排序最多要排n*(n-1)/2次(本题这样的原本序列是逆序列),最少要n-1次冒泡次数(由小到大的正序列)。
9.1946年诞生于美国宾夕法尼亚大学的ENIAC属于(A)计算机。
A.电子管:
电子管元件在运行时产生的热量太多,可靠性较差,运算速度不快,价格昂贵,体积庞大,这些都使计算机发展受到限制
B.晶体管:
1954年,美国贝尔实验室研制成功第一台使用晶体管线路的计算机,取名“催迪克”(TRADIC),装有800个晶体管。
晶体管不仅能实现电子管的功能,又具有尺寸
小、重量轻、寿命长、效率高、发热少、功耗低等优点
C.集成电路:
1958年,美国德州仪器的工程师JackKilby发明了集成电路(IC),将三种电子元件结合到一片小小的硅片上。
更多的元件集成到单一的半导体芯片上,计算机变得更小,功耗更低,速度更快
D.超大规模集成电路:
60年代初期,美国的基尔比和诺伊斯发明了集成电路,引发了电路设计革命。
随后,集成电路的集成度以每3-4年提高一个数量级的速度增长。
大规模集成电路(LSI)可以在一个芯片上容纳几百个元件。
到了80年代,超大规模集成电路(VLSI)在芯片上容纳了几十万个元件,后来的甚大规模集成电路(ULSI)上将数量扩充到百万级。
使得计算机的体积和价格不断下降,而功能和可靠性不断增强。
10.无论是TCP/IP模型还是OSI模型,都可以视为网络的分层模型,每个网络协议都会被归入某一层中。
如果用现实生活中的例子来比喻这些“层”,以下最恰当的是(A)。
分层思想是:
对等层之间执行相同的操作,较低的层为它的上一层提供服务。
下面左边是OSI模型,右边是OSI与TCP/IP模型对比:
A.中国公司的经理与波兰公司的经理交互商业文件:
B.军队发布命令:
C.国际会议中,每个人都与他国地位对等的人直接进行会谈:
D.体育比赛中,每一级比赛的优胜者晋级上一级比赛:
11.矢量图(VectorImage)图形文件所占的贮存空间比较小,并且无论如何放大、缩小或旋转等都不会失真,是因为它(B)。
A.记录了大量像素块的色彩值来表示图像
B.用点、直线或者多边形等基于数学方程的几何图元来表示图像
C.每个像素点的颜色信息均用矢量表示
D.把文件保存在互联网,采用在线浏览的方式查看图像
位图使用我们称为像素的一格一格的小点来描述图像,放大易失真
矢量图用点、直线或者多边形等基于数学方程的几何图元来表示图像,放大不易失真
12.如果一个栈初始时为空,且当前栈中的元素从栈底到栈顶依次为a,b,c,另有元素d已经出栈,则可能的入栈顺序是(D)。
A.a,d,c,bB.b,a,c,dC.a,c,b,dD.d,a,b,c
解析:
不管d在哪个位置,abc的顺序肯定是先a后b,最后c入栈的。
13.(B)是主要用于显示网页服务器或者文件系统的HTML文件的内容,并让用户与这些文件交互的一种软件。
A.资源管理器B.浏览器C.电子邮件D.编译器
14.(C)是目前互联网上常用的E-mail服务协议。
A.HTTPB.FTPC.POP3D.Telnet
解析:
HTTP:
超文本传输协议;
FTP:
文件传输协议
POP3是PostOfficeProtocol3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
SMTP
SMTP 的全称是“SimpleMailTransferProtocol”,即简单邮件传输协议。
它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。
SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
SMTP服务器就是遵循SMTP协议的发送邮件服务器。
15.(C)就是把一个复杂的问题分成两个或更多的相同类似的子问题,再把子问题分解成更小的子问题……直到最后的子问题可以简单地直接求解。
而原问题的解就是子问题解的合并。
A.动态规划B.贪心C.分治D.搜索
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。
对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。
如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。
这就是分治策略的基本思想。
给你一个装有16个硬币的袋子。
16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。
你的任务是找出这个伪造的硬币,工具是天平称。
你可以一个一个称,最终也能找出伪币。
这样要称10多次。
如果用分治方法,把16硬币分为AB两组,每组8个硬币。
轻的一组有伪币,假设B是轻的那一组,因此再把它分成两组,每组有4个硬币。
称其中一组为B1,另一组为B2。
比较这两组,肯定有一组轻一些。
如果B1轻,则伪币在B1中,再将B1又分成两组,每组有两个硬币,称其中一组为B1a,另一组为B1b。
比较这两组,可以得到一个较轻的组。
由于这个组只有两个硬币,因此不必再细分。
比较组中两个硬币的重量,可以立即知道哪一个硬币轻一些。
较轻的硬币就是所要找的伪币。
这样只要4次就可以找出伪币。
16.地址总线的位数决定了CPU可直接寻址的内存空间大小,例如地址总线为16位,其最大的可寻址空间为64KB。
如果地址总线是32位,则理论上最大可寻址的内存空间为(D)。
A.128KBB.1MBC.1GBD.4GB
2^16=64K232=(2^16)*(2^16)=4294967296/1024/1024/1024=4G
17.蓝牙和Wi-Fi都是(C)设备。
A.无线广域网B.无线城域网C.无线局域网D.无线路由器
短程无线10-100米左右遇到阻碍更短
18.在程序运行过程中,如果递归调用的层数过多,会因为(A)引发错误。
A.系统分配的栈空间溢出B.系统分配的堆空间溢出
C.系统分配的队列空间溢出D.系统分配的链表空间溢出
19.原字符串中任意一段连续的字符所组成的新字符串称为子串。
则字符“AAABBBCCC”共有(C)个不同的非空子串。
A.3B.12C.36D.45
穷举:
1个字符:
3种,2个字符:
5种,3个字符7种,4个字符6种,5个字符5种,6个字符4种,7个字符3种,8个字符2种,9个字符1种。
共36种不同的连续非空子串。
20.仿生学的问世开辟了独特的科学技术发展道路。
人们研究生物体的结构、功能和工作原理,并将这些原理移植于新兴的工程技术中。
以下关于仿生学的叙述,错误的是(B)
A.由研究蝙蝠,发明雷达B.由研究蜘蛛网,发明因特网
C.由研究海豚,发明声纳D.由研究电鱼,发明伏特电池
A.1938年,研究蝙蝠领域的鼻祖————Griffin在哈佛大学生物系学习期间,做过试验,把蝙蝠的眼睛手术掉,蝙蝠的飞行不受丝毫影响,科学家经过反复研究,终于揭开了蝙蝠能在夜里飞行的秘密。
它一边飞,一边从嘴里发出一种声音。
这种声音叫做超声波,人的耳朵是听不见的,蝙蝠的耳朵却能听见。
超声波像波浪一样向前推进,遇到障碍物就反射回来,传到蝙蝠的耳朵里,蝙蝠立刻改变飞行的方向。
科学家摹仿蝙蝠探路的办法,给飞机装上了雷达。
雷达通过天线发出无线电波,无线电波遇到障碍物就反射回来,显示在荧光屏上。
驾驶员从雷达的荧光屏上,能够看清楚前方有没有障碍物,所以飞机在夜里飞行也十分安全。
B.由研究海豚,发明声纳:
回声定位原理,和蝙蝠差不多,介质不同,一个空气,一个水里。
C.由研究蜘蛛网,发明了鱼网
D经过对电鱼的解剖研究,终于发现在电鱼体内有一种奇特的发电器官。
这些发电器是由许多叫电板或电盘的半透明的盘形细胞构成的。
由于电鱼的种类不同,所以发电器的形状、位置、电板数都不一样。
经过对电鱼的解剖研究,终于发现在电鱼体内有一种奇特的发电器官。
这些发电器是由许多叫电板或电盘的半透明的盘形细胞构成的。
由于电鱼的种类不同,所以发电器的形状、位置、电板数都不一样。
电鲶的发电器起源于某种腺体,位于皮肤与肌肉之间,约有500万块“电板”,每片“电板”发电很微弱,但500万块“电板”却能使它发出几百伏特的电压!
二、问题求解(共2题,每题5分,共计10分)
1.如果平面上任取n个整点(横纵坐标都是整数),其中一定存在两个点,它们连线的中点也是整点,那么n至少是____5______。
想象横纵交错的网格纸,就像棋盘那样的,每个横纵线交点就是一个整点。
如下图
如果n=2,取两个连续的整点,那么连线中点不是整点。
如果n=3,取水平两个连续的点,垂直也两个连续的点,组成三角形。
那么连线中点不是整点。
如果n=4,取四个整点组成一个正方形,则连线中点不是整点。
而取5个点的话,必然有两个点的连线中点是整点。
2.在NOI期间,主办单位为了欢迎来自各国的选手,举行了盛大的晚宴。
在第十八桌,有5名大陆选手和5名港澳选手共同进膳。
为了增进交流,他们决定相隔就坐,即每个大陆选手左右旁都是港澳选手,每个港澳选手左右旁都是大陆选手。
那么,这一桌一共有___2880____种不同的就坐方案。
注:
如果在两个方案中,每个选手左右相邻的选手相同,则视为同一种方案。
解:
五个大陆人隔一个位置任意坐5个座位,1个港澳人固定位置后其他4个港澳人任意坐剩下的4个位置,这样能保证不会出现每个选手左右相邻的选手相同的情况出现,故P55*P44=5*4*3*2*1*4*3*2*1=2880种
相当于1个圆,十个人。
先随便找个座,让人去坐,有10个可能,然后顺时针走,下一个座就有5种可能,再下一个就4个,再下一个还是4个,以此类推,就是10*5*4*4*3*3*2*2*1*1。
这其中有重复的,同一种坐法,可以绕着桌子走一圈,就是上一个人坐到下一个人的位置,串一下,这样所有坐法就算重复了10次,再除以10就行了。
就是5*4*4*3*3*2*2*1*1
三、阅读程序写结果。
(共4题,每题8分,共计32分)
1.var
a,b,c,d,e,ans:
integer;
beginreadln(a,b,c);
d:
=a+b;
e:
=b+c;
ans:
=d+e;
writeln(ans);
end.
输入:
125
输出:
__10____________
2.varn,i,ans:
integer;
beginreadln(n);
ans:
=0;
fori:
=1tondo
if(nmodi)=0then
ans:
=ans+1;
writeln(ans);
end.
输入:
18
输出:
_______6______
mod函数是取余数函数(两数相除,取其余数)
if(nmodi)=0的意思是假如n能整除i(余数为0)
3.var
n,i,j:
integer;
a:
array[1..100,1..100]ofinteger;
functionsolve(x,y:
integer):
integer;
varu,v:
integer;
beginifx=nthen
beginsolve:
=a[x,y];
exit;
end;
u:
=solve(x+1,y);
v:
=solve(x+1,y+1);
ifu>vthen
solve:
=a[x,y]+u
else
solve:
=a[x,y]+v;
end;
begin
read(n);
fori:
=1tondo
forj:
=1toido
read(a[i,j]);
writeln(solve(1,1));
end.
输入:
5
2
-14
2-1-2
-1640
32-158
输出:
_____14_________
4.var
n,ans,i,j:
integer;
S:
string;
Functionget(i:
integer):
char;
begin
ifi<=nthen
get:
=s[i]
elseget:
=s[i-n];
end;
beginreadln(s);
n:
=length(s);
ans:
=1;
fori:
=2tondo
beginforj:
=0ton-1do
ifget(i+j)beginans:
=i;
break;
end
elseifget(i+j)>get(ans+j)then
break;
end;
forj:
=0ton-1do
write(get(ans+j));
writeln;
end.
输入:
CBBADADA
输出:
_ACBBADAD___________
四、完善程序(前2空每空2分,后8空每空3分,共计28分)
1.(坐标统计)输入n个整点在平面上的坐标。
对于每个点,可以控制所有位于它左下方的点(即x、y坐标都比它小),它可以控制的点的数目称为“战斗力”。
依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战
答案:
四、
1:
1.0
2.y[j]3.f[i]:
=f[i]+1;
4.(i>1)and(f[i]>f[i-1])
5.ans:
=max_f
2:
1false
2used[data[i]]:
=flase
3.j
4.n
5.break
斗力并列最高,输出其中最大的编号)。
Const
SIZE=100;
Var
X,y,f:
array[1..SIZE]ofinteger;
N,i,j,max_f,ans:
integer;
Beginreadln(n);
Fori:
=1tondo
Readln(x[i],y[i]]);
Max_f:
=0;
Fori:
=1tondo
Beginf[i]:
=①;
Forj:
=1tondo
Beginif(x[j]③;
End;
If④then
Beginmax_f:
=f[i];
⑤;
End;
End;
Fori:
=1tondo
Writeln(f[i]);
Writeln(ans);
End.
2.(排列数)输入两个正整数n,m(1例如:
输入:
32
输出:
12
13
21
23
31
32
const
SIZE:
=25;
var
used:
array[1..SIZE]ofboolean;
data:
array[1..SIZE]orinteger;
n,m,i,j,k:
integer;
flag:
boolean;
beginreadln(n,m);
fillchar(used,sizeof(used),false);
fori:
=1tomdo
begindata[i]:
=i;
used[i]:
=true;
end;
flag:
=true;
Whileflagdo
beginfori:
=1tom-1dowrite(data[i],’‘);
writeln(data[m]);
flag:
=①;
fori:
=mdownto1do
begin②;
forj:
=data[i]+1tondoifused[j]=falsethen
beginused[j]:
=true;
data[i