2019 年海淀区青少年程序设计挑战活动复赛
小学组 C++语言试题
竞赛时间:2019 年 4 月 27 日 9:00~11:00
注意事项:
1. 答题统一在windows系统下使用DEVC++5.11版本编程环境。
2. 在计算机D盘根目录下创建一个以BJHDF和自己考号为文件名的文件夹。
如:D:\ BJHDF0001。
2. 各题最后写好的源文件,按照题目规定的文件名存入上述文件夹中。
3. 完成作答后,提交自己创建的整个文件夹,该文件夹仅仅包含各题的源
文件,不能包含子文件夹,或其它任何文件。
4. 共有6道题目,每题100分。
切记:答案严格按照题目要求命名。有疑问及时举手询问监考老师。
试题
试题1:约数 (divisor)
源代码:divisor.cpp
输入文件:divisor.in
输出文件:divisor.out
时间限制:1s
空间限制:512MB
【题目描述】
对于一个正整数n,如果n除以某个正整数d所得的余数为0,我们称d是n的
约数。显然1和n一定是n的约数,请问对于给定的n(n≥2),除了n本身以外,最
大的约数是多少?
【输入说明】
共一行,包含一个正整数n。
【输出说明】
共一行,包含一个正整数,表示n除了自身以外的最大约数。
【样例输入】
15
【样例输出】
5
【样例解释】
15的约数有1,3,5,15,除了15本身以外的最大约数为5。
【数据范围】
对于30%的数据,n≤100;
对于50%的数据,n≤10
6;
对于100%的数据,2≤n≤2×10
9 。
试题2:阶乘(factorial)
源代码: factorial.cpp
输入文件: factorial.in
输出文件: factorial.out
时限: 1s
内存: 64M
【题目描述】
n的阶乘定义为n! = n ∗ (n − 1) ∗ (n − 2) ∗ ... ∗ 1。
n的双阶乘定义为n!! = n ∗ (n − 2) ∗ (n − 4) ∗ ... ∗ 2或n!! = n
∗ (n − 2) ∗ (n − 4) ∗ ... ∗ 1,取决于n的奇偶性。
但是阶乘的增长速度太快了,所以我们现在只想知道n!和n!!末尾的0的个数。
【输入说明】
一个正整数n, n ≤ 10
7
【输出说明】
两个整数, 分别为n!和n!!末尾0的个数。
【样例输入1】
10
【样例输出1】
2 1
【样例解释1】
10! = 3628800, 10!! = 10 ∗ 8 ∗ 6 ∗ 4 ∗ 2 = 3840
【样例输入2】
5
【样例输出2】
1 0
【样例解释2】
5! = 120, 5!! = 5 ∗ 3 ∗ 1 = 15
试题3 : 序列 (sequence)
源代码: sequence.cpp
输入文件:sequence.in
输出文件:sequence.out
时间限制:1s
空间限制:512MB
【题目描述】
小Z手上有一个长度为n的整数序列a1, a2,…,an,但是他不太喜欢这个序
列,因此他想通过一些操作将序列a变成自己想要的序列b。初始时序列b是空的,
接下来小Z将依次进行n次操作,其中第i次操作分为以下两步:
1. 将ai加到序列b的尾部;
2. 翻转序列b(即b1,b2,…,bi变成bi,bi-1,…,b1 )。
小Z想知道n次操作之后序列b会是什么样的,你能帮助他吗?
【输入说明】
第一行包含一个正整数n;
第二行包含n个正整数,第i个正整数表示ai。
【输出说明】
共一行,包含n个数,表示n次操作后的序列b。
【样例输入】
4
1 2 3 4
【样例输出】
4 2 1 3
【样例解释】
每次操作后序列b如下:
●1
●2,1
●3,1,2
●4,2,1,3
【数据范围】
对于20%的数据,n≤100;
对于50%的数据,n≤1000;
对于100%的数据,1≤n≤2×10
5,0≤ai≤10
9。
试题4:糖果(candy)
源代码: candy.cpp
输入文件:candy.in
输出文件:candy.out
时间限制:1s
空间限制:128MB
【题目描述】
小民是一个很喜欢吃糖果的小孩子,他给所有的糖果进行了分类,有A~Z 一共26种糖果,现在小民有一排糖果,小民很奇怪,吃糖果只喜欢吃连续的若干
个,并且不希望吃到相同分类的糖果。现在小民让你帮他计算一下L的最大值,
使得他的一排糖果中的任意连续L个糖果都不会有相同的分类。
【输入说明】
输入仅一行,一行由大写字母组成的字符串,代表小民的一排糖果。
【输出说明】
输出仅一行,输出L的最大值。如果一排糖果都没有相同的,请输出− 1。
【样例输入】
ABABABABABAB
【样例输出】
2
【数据范围】
令字符串的长度为N
对于20%的数据:1 ≤ N ≤ 100;
对于50%的数据:1 ≤ N ≤ 1000;
对于70%的数据:1 ≤ N ≤ 10000;
对于100%的数据:1 ≤ N ≤ 10000000。
试题5:迷宫 (maze)
源代码:maze.cpp
输入文件:maze.in
输出文件:maze.out
时间限制:1s
空间限制:512MB
【题目描述】
最近,小Y在玩一款迷宫游戏,游戏是在一个n∗ m的网格上进行的,每个
格子可能是空地或者障碍物。游戏一开始,玩家控制的角色位于图中的某块空地
上。在游戏过程中,玩家可以用上下左右键控制角色向相邻且没有障碍物的格子
移动(当然,角色不能移动到地图之外,也不能对角线移动)。游戏的目标是收
集地图上出现的星星(每个星星只能收集一次),收集的数量越多分数越高。小
Y刚开了一局游戏,假设游戏时间没有限制,他想知道自己最多能收集到多少个
星星。
【输入说明】
第一行包含两个正整数n和m,表示游戏的地图包含n行m列。
接下来给出一个n×m的字符矩阵,每个字符可能为以下几种:
● #:表示该位置有障碍物
● . (英文句号):表示该位置是空地
● *:表示该位置是空地,且生成了一颗星星
● S :表示该位置是空地,且玩家初始时位于该位置,保证图中有且只有
一个S
【输出说明】
共一行,包含一个整数,表示最多能收集到多少颗星星
【样例输入】
4 8
..#...*.
*.#.S#..
######..
.*..#.*.
【样例输出】
2
【数据范围】
对于50%的数据,n,m≤40;
对于100%的数据,1≤n,m≤200。
试题6:盒子(box)
源代码:box.cpp
输入文件:box.in
输出文件:box.out
时间限制:1s
空间限制:512MB
【题目描述】
小D在玩堆盒⼦的游戏,每个盒⼦有⼀个强度,代表它上⽅最多能堆多少个
盒⼦。由于盒⼦都是⼀样⼤的,所以不能在⼀个盒⼦上并列放超过⼀个盒⼦。
现在小D有n个盒子,第i个盒⼦的强度为xi。⼩D想知道,如果他要把这些盒
⼦全部堆起来,至少要堆多少堆。
【输入说明】
从⽂件box.in 读⼊。
第⼀⾏读⼊一个整数n,代表⼩D有的盒⼦个数。
第⼆行读入n个整数,第i个整数xi表示第i个盒⼦的强度。
【输入说明】
输出到文件box.out。
共⼀行,⼀个整数表示小D⾄少要堆多少堆。
【样例输入】
5
0 2 1 1 2
【样例输出】
2
【数据范围】
对于20%的数据,n≤10;
对于50%的数据,n≤1000;
对于100%的数据,n≤500000,xi≤1000000000。