第十五届全国青少年信息学奥林匹克联赛初赛试题.docx
《第十五届全国青少年信息学奥林匹克联赛初赛试题.docx》由会员分享,可在线阅读,更多相关《第十五届全国青少年信息学奥林匹克联赛初赛试题.docx(15页珍藏版)》请在冰豆网上搜索。
第十五届全国青少年信息学奥林匹克联赛初赛试题
2009第十五届全国青少年信息学奥林匹克联赛初赛试题
(提高组C语言二小时完成)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一.单项选择题(共10题,每题1.5分,共计15分。
每题有且仅有一个正确答案。
)
1、关于图灵机下面的说法哪个是正确的:
A)图灵机是世界上最早的电子计算机。
B)由于大量使用磁带操作,图灵机运行速度很慢。
C)图灵机只是一个理论上的计算模型。
D)图灵机是英国人图灵发明的,在二战中为破译德军的密码发挥了重要作用。
【分析】选择C
A最早的计算机是ENIAC
B图灵机是计算机模型,没有运行速度,更谈不上磁带操作
D图灵机是英国人阿兰图灵提出的理论,
阿兰图灵本人在二战中破译德军密码系统发挥重要作用,而不是图灵机发挥作用
2、关于BIOS下面的说法哪个是正确的:
A
A)BIOS是计算机基本输入输出系统软件的简称。
B)BIOS里包含了键盘、鼠标、声卡、图形界面显器等常用输入输出设备的驱动程序。
C)BIOS一般由操作系统厂商来开发完成。
D)BIOS能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。
其实bios=BasicInputOutputSystem。
但是对于是否是软件这一说法还存在争议呢!
B中BIOS只存一些系统启动的基本信息,这些设备的驱动程序是不存的。
C项中BIOS一般是由单独的芯片厂家生产的,最著名的都是台湾的三家。
D项中,固件BIOS根本这些功能
3、已知大写字母A的ASCII编码为65(十进制),则大写字母J的十六进制ASCII编码为:
A)48B)49C)50D)以上都不是
4、在字长为16位的系统环境下,一个16位带符号整数的二进制补码为1111111111101101。
其对应的十进制整数应该是:
A)19B)-19C)18D)-18
111111*********1的原码为1000000000010011也就是-19,最高位为符号位
5、一个包含n个分支结点(非叶结点)的非空满k叉树,k>=1,它的叶结点数目为:
D
A)nk+1B)nk-1C)(k+1)n-1D.(k-1)n+1
考多叉树的性质,N0=(K-1)N+1,考试的时带入K=2时候,验证二叉树能得到结果
6.表达式a*(b+c)-d的后缀表达式是:
B
A)abcd*+-B)abc+*d-C)abc*+d-D)-+*abcd
主要是考树的遍历,要明白前缀、中缀和后缀表达式。
构造二叉树,操作数做叶子节点,运算符做非叶节点。
按中序遍历就可以得到中缀表达式
7、最优前缀编码,也称Huffman编码。
这种编码组合的特点是对于较频繁使用的元素给与较短的唯一编码,以提高通讯的效率。
下面编码组合哪一组不是合法的前缀编码。
B
A)(00,01,10,11)
B)(0,1,00,11)
C)(0,10,110,111)
D)(1,01,000,001)
0是00的前缀码,这部分是数据结构中哈夫曼编码处的知识
8、快速排序平均情况和最坏情况下的算法时间复杂度分别为:
A
A)平均情况O(nlog2n),最坏情况O(n2)
B)平均情况O(n),最坏情况O(n2)
C)平均情况O(n),最坏情况O(nlog2n)
D)平均情况O(log2n),最坏情况O(n2)
最好的时候是n×log(2,n),最坏情况的是退化成冒泡排序,复杂度为O(n^2)
9、左图给出了一个加权无向图,从顶点V0开始用prim算法求最小生成树。
则依次加入最小生成树的顶点集合的顶点序列为A:
A)V0,V1,V2,V3,V5,V4
B)V0,V1,V5,V4,V3,V3
C)V1,V2,V3,V0,V5,V4
D)V1,V2,V3,V0,V4,V5
加入的边依次为v0v1、v1v2、v1v3(或v2v3)、v1v5、v3v4
10、全国信息学奥林匹克的官方网站为参与信息学竞赛的老师同学们提供相关的信息和资源,请问全国信息学奥林匹克官方网站的网址是:
C
A)B)http:
//www.noi.org/
C)D)
二.不定项选择题(共10题,每题1.5分,共计15分。
每题正确答案的个数不少于1。
多选或少选均不得分)。
1、关于CPU下面哪些说法是正确的:
AB
A)CPU全称为中央处理器(或中央处理单元)。
B)CPU能直接运行机器语言。
C)CPU最早是由Intel公司发明的。
D)同样主频下,32位的CPU比16位的CPU运行速度快一倍。
C项中,Intel最早发明的是微处理器,而CPU之前就由电子管、晶体管实现着呢D项中,位数只能说明处理的字长,所在的系统硬件指令不同,速度很难说谁快
2、关于计算机内存下面的说法哪些是正确的:
BD
A)随机存储器(RAM)的意思是当程序运行时,每次具体分配给程序的内存位置是随机而不确定的。
B)一般的个人计算机在同一时刻只能存/取一个特定的内存单元。
C)计算机内存严格说来包括主存(memory)、高速缓存(cache)和寄存器(register)三个部分。
D)1MB内存通常是指1024*1024字节大小的内存。
一般是对字节的一个单元串行操作。
1MB=1024KB=1024*1024B
A中RAM不是位置随机,而是随时访问,所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。
C中高速缓存和寄存器的物理实现是集成在CPU中,这两部分不属于冯诺依曼体系中的五大部分的任意一个部分。
3、关于操作系统下面说法哪些是正确的:
BC
A.多任务操作系统专用于多核心或多个CPU架构的计算机系统的管理。
B.在操作系统的管理下,一个完整的程序在运行过程中可以被部分存放在内存中。
C.分时系统让多个用户可以共享一台主机的运算能力,为保证每个用户都得到及时的响应通常会采用时间片轮转调度的策略。
D.为了方便上层应用程序的开发,操作系统都是免费开源的。
A多任务系统可以是单个CPU构架的,普通的PC都是多任务的。
D操作系统不是都免费开源
4、关于计算机网络,下面的说法哪些是正确的:
C
A)网络协议之所以有很多层主要是由于新技术需要兼容过去老的实现方案。
B)新一代互联网使用的IPv6标准是IPv5标准的升级与补充。
C)TCP/IP是互联网的基础协议簇,包含有TCP和IP等网络与传输层的通讯协议。
D)互联网上每一台入网主机通常都需要使用一个唯一的IP地址,否则就必须注册一个固定的域名来标明其地址。
A网络协议分层不是为了兼容,而是根据网络分层模型来的。
B新的IPv6是IPv4的升级。
D即使注册了域名也要有IP地址的
5、关于HTML下面哪些说法是正确的:
BD
A)HTML全称超文本标记语言,实现了文本、图形、声音乃至视频信息的统一编码。
B)HTML不单包含有网页内容信息的描述,同时也包含对网页格式信息的定义。
C)网页上的超链接只能指向外部的网络资源,本网站网页间的联系通过设置标签来实现。
D)点击网页上的超链接从本质上就是按照该链接所隐含的统一资源定位符(URL)请求网络资源或网络服务。
A没有都统一编码
C本网站页面也可以用超链接,就是绝对路径。
也可以用相对路径。
6、若3个顶点的无权图G的邻接矩阵用数组存储为{{0,1,1},{1,0,1},{0,1,0}},假定在具体存储中顶点依次为:
v1,v2,v3。
关于该图,下面的说法哪些是正确的:
ABD
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;free(p);
D)在尾部删除一个结点的语句序列为。
p=clist;clist=clist->next;free(p);
8、散列表的地址区间为0-10,散列函数为H(K)=Kmod11。
采用开地址法的线性探查法处理冲突,并将关键字序列26,25,72,38,8,18,59存储到散列表中,这些元素存入散列表的顺序并不确定。
假定之前散列表为空,则元素59存放在散列表中的可能地址有:
A)5B)7C)9D)10
选择ABC哈希函数的冲突避免
计算各个的散列值2625723881859
4365874
这样就可能5的顺序:
25、59……7的顺序:
25、26、38、59……
9的顺序:
25、26、38、18、59……上面的顺序不是唯一的。
9、排序算法是稳定的意思是关键码相同的记录排序前后相对位置不发生改变,下列哪些排序算法是稳定的:
ABCD
A)插入排序B)基数排序C)归并排序D)冒泡排序
在编程实现的时候,只要控制好边界都是可以达到稳定排序的
10、在参加NOI系列竞赛过程中,下面哪些行为是被严格禁止的:
ACD
A)携带书写工具,手表和不具有通讯功能的电子词典进入赛场。
B)在联机测试中通过手工计算出可能的答案并在程序里直接输出答案来获取分数。
C)通过互联网搜索取得解题思路。
D)在提交的程序中启动多个进程以提高程序的执行效率。
三.问题求解(共2题,每空5分,共计10分)
1.拓扑排序是指将有向无环图G中的所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若∈E(G),则u在线性序列中出现在v之前,这样的线性序列成为拓扑序列。
如下的有向无环图,对其顶点作拓扑排序,则所有可能的拓扑序列的个数为432。
用排列组合即可,先确定12346的顺序,然后将7插入内部有两个位置可选,然后将5插入时候,可以有6个位置选择。
最后,放89的时候,考虑两种情况,89在一起,有8个位置选;89不在一起,8个位置选2个。
C(2,1)×C(6,1)×[C(8,1)+C(8,2)]=2×6×(8+28)=432
2.某个国家的钱币面值有1,7,72,73共计四种,如果要用现金付清10015元的货物,假设买卖双方各种钱币的数量无限且允许找零,那么交易过程中至少需要流通35张钱币。
10015化成7进制数是41125,正常是4×7+1=29张7^3面额的,1张7^2面额,2张7面额的,5张1面额的。
因为可以无限且找零,并要求最少流通数量。
这样就把7进制上大于等于4的数a,用找零7-a的方法代替,这样就能达到最少。
这里29、1、2、5中只有5是大于4的,所以用一张大额的,并7-5找零的方法计算。
这样,总数29+1+2+(1+7-5)=35张。
四.阅读程序写结果(共4题,每题8分,共计32分)
1.#include
inta,b;
intwork(inta,intb){
if(a%b)
returnwork(b,a%b);
returnb;
}
intmain(){
scanf("%d%d",&a,&b);
printf("%d\n",work(a,b));
return0;
}
输入:
123321
输出:
_________
2.#include
intmain()
{
inta[4],b[4];
inti,j,tmp;
for(i=0;i<4;i++)
scanf("%d",&b[i]);
for(i=0;i<4;i++)
{
a[i]=0;
for(j=0;j<=i;j++)
{
a[i]+=b[j];
b[a[i]%4]+=a[j];
}
}
tmp=1;
for(i=0;i<4;i++)
{
a[i]%=10;
b[i]%=10;
tmp*=a[i]+b[i];
}
printf("%d\n",tmp);
return0;
}
输入:
2357
输出:
_______________
3.#include
#definemaxn50
constinty=2009;
intmain()
{
intn,c[maxn][maxn],i,j,s=0;
scanf("%d",&n);
c[0][0]=1;
for(i=1;i<=n;i++)
{
c[i][0]=1;
for(j=1;j
c[i][j]=c[i-1][j-1]+c[i-1][j];
c[i][i]=1;
}
for(i=0;i<=n;i++)
s=(s+c[n][i])%y;
printf("%d\n",s);
return0;
}
输入:
17
输出:
4.#include
intmain()
{
intn,m,i,j,p,k;
inta[100],b[100];
scanf("%d%d",&n,&m);
a[0]=n;
i=0;
p=0;
k=0;
do
{
for(j=0;j
if(a[i]==a[j])
{
p=1;
k=j;
break;
}
if(p)
break;
b[i]=a[i]/m;
a[i+1]=a[i]%m*10;
i++;
}while(a[i]!
=0);
printf("%d.",b[0]);
for(j=1;jprintf("%d",b[j]);
if(p)
printf("(");
for(j=k;j
printf("%d",b[j]);
if(p)
printf(")");
printf("\n");
return0;
}
输入:
513
输出:
_________
五.完善程序(前5空,每空2分,后6空,每空3分,共28分)
1.(最大连续子段和)给出一个数列(元素个数不多于100),数列元素均为负整数、正整数、0。
请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列中元素的个数。
例如数列为4,-5,3,2,4时,输出9和3;数列为123-5078时,输出16和7。
#include
inta[101];
intn,i,ans,len,tmp,beg,end;
intmain(){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
tmp=0;
ans=0;
len=0;
beg=①;
for(i=1;i<=n;i++){
if(tmp+a[i]>ans){
ans=tmp+a[i];
len=i-beg;
}
elseif(②&&i-beg>len)
len=i-beg;
if(tmp+a[i]③){
beg=④;
tmp=0;
}
else
⑤;
}
printf("%d%d\n",ans,len);
return0;
}
2.(寻找等差数列)有一些长度相等的等差数列(数列中每个数都为0~59的整数),设长度均为L,将等差数列中的所有数打乱顺序放在一起。
现在给你这些打乱后的数,问原先,L最大可能为多大?
先读入一个数n(1<=n<=60),再读入n个数,代表打乱后的数。
输出等差数列最大可能长度L。
#include
inthash[60];
intn,x,ans,maxnum;
intwork(intnow){
intfirst,second,delta,i;
intok;
while(①&&!
hash[now])
++now;
if(now>maxnum)
return1;
first=now;
for(second=first;second<=maxnum;second++)
if(hash[second]){
delta=②;
if(first+delta*③>maxnum)
break;
if(delta==0)
ok=(④);
else{
ok=1;
for(i=0;iok=⑤&&(hash[first+delta*i]);
}
if(ok){
for(i=0;ihash[first+delta*i]--;
if(work(first))
return1;
for(i=0;ihash[first+delta*i]++;
}
}
return0;
}
intmain(){
inti;
memset(hash,0,sizeof(hash));
scanf("%d",&n);
maxnum=0;
for(i=0;iscanf("%d",&x);
hash[x]++;
if(x>maxnum)
maxnum=x;
}
for(ans=n;ans>=1;ans--)
if(n%ans==0&&⑥){
printf("%d\n",ans);
break;
}
return0;
}