第二十一届全国青少年信息学奥林匹克联赛初赛
普及组
C++
语言试题
竞赛时间:
2015
年
10
月
11
日
14:30-16:30
一、单项选择题
(
共
20
题,每题
1.5
分,共计
30
分;每题有且仅有一个正确选项
)
⒈
1MB
等于
( )
。
A.10000
字节
B.1024
字节
C.1000×1000
字节
D.1024×1024
字节
解析:答案D,1MB = 1024KB = 1024*1024B
⒉在
PC
机中,
PENTIUM(
奔腾
)
、酷睿、赛扬等 是指
( )
。
A.
生产厂家名称
B.
硬盘的型号
C.CPU
的型号
D.
显示器的型号
解析:C,考察计算机常识,全球两大个人电脑处理器厂商:Intel和AMD。
奔腾、酷睿、赛扬都是Intel生产的处理器型号。
性能:赛扬(低端)< 奔腾(中低端)< 酷睿(高端)。
奔腾、酷睿、赛扬都是Intel生产的处理器型号。
性能:赛扬(低端)< 奔腾(中低端)< 酷睿(高端)。
⒊操作系统的作用是
( )
。
A.
把源程序译成目标程序
B.
便于进行数据管理
C.
控制和管理系统资源
D.
实现硬件之间的连接
解析:C,计算机常识
⒋在计算机内部用来传送、存贮、加工处理的数据或指令都是以
( )
形式进行的。
A.
二进制码
B.
八进制码
C.
十进制码
D.
智能拼音码
解析:A,计算机常识
⒌下列说法正确的是
( )
。
A.CPU
的主要任务是执行数据运算和程序控制
B.
存储器具有记忆能力,其中信息任何时候都不会丢失
C.
两个显示器屏幕尺寸相同,则它们的分辨率必定相同
D.
个人用户只能使用
Wifi
的方式连接到
Internet
解析:A,计算机常识
⒍二进制数
00100100
和
00010100
的和是
( )
。
A.00101000 B.01100111 C.01000100 D.00111000
解析:D,使用加法计算,逢2进1
⒎与二进制小数
0.1
相等的十六进制数是
( )
。
A.0.8 B.0.4 C.0.2 D.0.1
解析:A,二进制转十六进制,一合四,0.1,小数部分0.1不足四位补足四位,1000-->8,即最终结果0.8
⒏所谓的“中断”是指
( )
。
A.
操作系统随意停止一个程序的运行
B.
当出现需要时,
CPU
暂时停止当前程序的执行转而执行处理新情况的过程
C.
因停机而停止一个程序的运行
D.
电脑死机
解析:C,计算机常识知识
⒐计算机病毒是
( )
。
A.
通过计算机传播的危害人体健康的一种病毒
B.
人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合
C.
一种由于计算机元器件老化而产生的对生态环境有害的物质
D.
利用计算机的海量高速运算能力而研制出来的用于疾病预防的新型病毒
解析:B,计算机常识
⒑
FTP
可以用于
( )
。
A.
远程传输文件
B.
发送电子邮件
C.
浏览网页
D.
网上聊天
解析:A,计算机常识,发送电子邮件的协议有STMP,POP3,FTP是文件传输协议
⒒下面哪种软件不属于即时通信软件
( )
。
A.QQ B.MSN C.
微信
D.P2P
解析:D,计算机常识
⒓
6
个顶点的连通图的最小生成树,其边数为
( )
。
A.6 B.5 C.7 D.4
详解:B,连通图指的是图中的任意两个结点都可以互相到达。
最小生成树就是几条边和最小
最小生成树就是几条边和最小
⒔链表不具备的特点是
( )
。
A.
可随机访问任何一个元素
B.
插入、删除操作不需要移动元素
C.
无需事物估计存储空间大小
D.
所需存储空间与存储元素个数成正比
解析:A,链表地址可以不连续,无需提前预估存储空间大小,但是访问没有数组方便
⒕线性表若采用链表存储结构,要求内存中可用存储单元地址
( )
。
A.
必须连续
B.
部分地址必须连续
C.
一定不连续
D.
连续不连续均可
解析:D,同上,通过指针指向下一个元素或者上一个元素
⒖今有一空栈
S
,对下列待进栈的数据元素序列
a
,
b
,
c
,
d
,
e
,
f
依次进行进栈,进栈,出栈,进栈,
进栈,出栈的操作,则此操作完成后,栈
S
的栈顶元素为
A.f B.c C.a D.b
解析:B,依次a,b进栈,b出栈,c进栈,d进栈,d出栈,最后栈顶元素为c,e,f没有操作到不需要管,不要自己加戏哦。
⒗前序遍历序列与中序遍历序列相同的二叉树为
( )
。
A.
根结点无左子树
B.
根结点无右子树
C.
只有根结点的二叉树或非叶子结点只有左子树的二叉树
D.
只有根结点的二叉树或非叶子结点只有右子树的二叉树
解析:先序遍历是根左右,中序遍历是左根右,要想先序和中序相同,那么要么是只有根节点,要么是非叶子节点只有右子树
⒘如果根的高度为
1,
具有
61
个结点的完全二叉树的高度为
( )
。
A.5 B.6 C.7 D.8
解析:B,2的n次方-1 = 61,则,n = 6,即二叉树的高度为6
⒙下列选项中不属于视频文件格式的是
( )
。
A.TXT B.AVI C.MOV D.RMVB
解析:A,TXT是文本格式
⒚设某算法的计算时间表示为递推关系式
T(n)=T(n-1)+n(n
为正整数
)
及
T(0)=1
,则该算法的时间复
杂度为
( )
。
A.O(logn) B.O(nlogn) C.O(n) D.O(n
2
)
解析:D,
T(n)
= T(n - 1) + n
= T(n - 2) + (n - 1) + n
= T(n - 3) + (n - 2) + (n - 1) + n
= T(1) + 2 + … + (n - 2) + (n - 1) + n
= T(0) + 1 + 2 + … + (n - 2) + (n - 1) + n
= 1 + n*(n + 1) / 2
= n2 / 2 + n / 2 + 1
= T(n - 1) + n
= T(n - 2) + (n - 1) + n
= T(n - 3) + (n - 2) + (n - 1) + n
= T(1) + 2 + … + (n - 2) + (n - 1) + n
= T(0) + 1 + 2 + … + (n - 2) + (n - 1) + n
= 1 + n*(n + 1) / 2
= n2 / 2 + n / 2 + 1
最高阶是n2,所以时间复杂度为n2。
⒛在
NOI
系列赛事中参赛选手必须使用累承办单位统一提供的设备。下列物品中不允许选手自带的是
(
)
。
A.
鼠标
B.
笔
C.
身份证
D.
准考证
解析:A
二、问题求解
(
共
2
题,每题
5
分,共计
10
分;每题全部答对得
5
分,没有部分分
)
⒈重新排列
1234
使得每一个数字都不在原来的位置上,一共有 种排法。
解析:9种,使用枚举法:
2143 2341 2413 3142 3412 3421 4123 4312 4321
⒉一棵结点数为
2015
的二叉树最多有 个叶子结点。
解析:1008,完全二叉树,满二叉树到完全二叉树,每少两个叶节点就多出一个叶结点。
满二叉树:2^11-1=2047,叶节点个数2^10=1024
完全二叉数:2047-2015=32,少了32个叶节点,应多出16个叶节点,故叶节点数:1024-32+16=1008
三、阅读程序写结果
(
共
4
题,每题
8
分,共计
32
分
)
⒈
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
a = 1;
b = 2;
c = 3;
if(a > b)
if(a > c)
cout << a << ' ';
else
cout << b << ' ';
cout << c << endl;
return 0;
}
输出:答案是3
⒉.
#include <iostream>
using namespace std;
struct point
{
int x;
int y;
};
int main()
{
int a, b, c;
struct EX{
int a;
int b;
point c;
}e;
e.a = 1;
e.b = 2;
e.c.x = e.a + e.b;
e.c.y = e.a * e.b;
cout << e.c.x << ',' << e.c.y << endl;
return 0;
}
输出:3,2
3.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int i;
int count;
count = 0;
getline(cin, str);
for(i = 0; i < str.length(); i++)
if(str[i] >= 'a' && str[i] <= 'z')
count++;
cout << "It has " << count << " lowercases" << endl;
return 0;
}
输入:
NOI2016 will be held in Mian Yang.
输出:It has 18 lowercases,统计小写字符个数
4.
#include <iostream>
#include <string>
using namespace std;
void fun(char *a, char *b)
{
a = b;
(*a)++;
}
int main()
{
char c1, c2, *p1, *p2;
c1 = 'A';
c2 = 'a';
p1 = &c1;
p2 = &c2;
fun(p1, p2);
cout << c1 << c2 << endl;
return 0;
}
输出:Ab,指针的用法,a = b的操作是将p1的指针转而指向p2了,修改(*a)++,相当于修改了p2的值,那么c1就还是原来的A,c2和p2指向的是同一个地方,故c2是字母b
四、完善程序
(
共
2
题,每题
14
分,共计
28
分
)
⒈
(
打印月历
)
输入月份
m(1≤m≤12)
,按一定格式打印
2015
年第
m
月的月历。
(
第三、四空
2.5
分,
其余
3
分
)
例如,
2015
年
1
月的月历打印效果如下
(
第一列为周日
)
:
S | M | T | W | T | F | S |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
#include <iostream>
#include <string>
using namespace std;
const int dayNum[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int m, offset, i;
int main()
{
cin >> m;
cout << "S\tM\tT\tW\tT\tF\tS" << endl; //'\t'为 TAB 制表符
⑴ ;
for(i = 1; i < m; i++)
offset = ⑵ ;
for(i = 0; i < offset; i++)
cout << '\t';
for(i = 1; i <= ⑶ ; i++)
{
cout << ⑷ ;
if(i == dayNum[m] || ⑸ == 0)
cout << endl;
else
cout << '\t';
}
return 0;
}
解析:(1)offset=4(2)(offset+dayNum[m])%7(3)dayNum[m] (4)i (5) (offset + i) % 7
dayNum数组中的数据是12个月的天数。
将2015年1月的数据代入该程序,进行模拟,第一步写出(3)空,第二步写出(4)空,第三步写出(1)空,第四步写出(5)空,最难写的是(2)空,写该空时尝试了2015年2月的数据。
⒉
(
中位数
median)
给定
n(n
为奇数且小于
1000)
个整数,整数的范围在
0~m(0<m<2^31)
之间,请使
用二分法求这
n
个整数的中位数。所谓中位数,是指将这
n
个数排序之后,排在正中间的数。
(
第五空
2
分,其余
3
分
)
#include <iostream>
using namespace std;
const int MAXN = 1000;
int n, i, lbound, rbound, mid, m, count;
int x[MAXN];
int main()
{
cin >> n >> m;
for(i = 0; i < n; i++)
cin >> x[i];
lbound = 0;
rbound = m;
while( ⑴ )
{
mid = (lbound + rbound) / 2;
⑵ ;
for(i = 0; i < n; i++)
if( ⑶ )
⑷ ;
if(count > n / 2)
lbound = mid + 1;
else
⑸ ;
cout << mid << " " << lbound << " " << rbound << " " << count << endl;
}
cout << rbound << endl;
return 0;
}
解析:(1) lbound < rbound / rbound > lbound(2) count = 0 (3)x[i] >= mid (4)count++ (5) rbound = mid