历年CSP-J初赛真题解析 | 2016年CSP-J初赛
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_热爱编程的通信人的博客-CSDN博客
单项选择
第1题
以下不是微软公司出品的软件是( )
A.Powerpoint
B.Word
C.Excel
D.Acrobat Reader
【答案】:D
【解析】
A、B、C都是属于微软的Office软件。D选项是Adobe公司的,读取PDF的软件
第2题
如果256种颜色用二进制编码来表示,至少需要( )位。
A.6
B.7
C.8
D.9
【答案】:C
【解析】
\(2^8=256\)
第3题
以下不属于无线通信技术的是( )。
A.蓝牙
B.Wifi
C.GPRS
D.以太网
【答案】:D
【解析】
A、B都是无线技术,C选项是2G网络中的数据传输技术,D选项是有线通信技术
第4题
以下不是CPU生产厂商的是( )。
A.Intel
B.AMD
C.Microsoft
D.IBM
【答案】:C
【解析】
同2015年,Intel和AMD都是CPU生产厂商,Microsoft只生产软件。IBM生产服务器的CPU
第5题
以下不是存储设备的是( )。
A.光盘
B.磁盘
C.固态硬盘
D.鼠标
【答案】:D
【解析】
计算机常识
第6题
如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照CapsLock、字母键A、字母键S和字母键D的顺序循环按键, 即CapsLock、A、S、D、CapsLock、A、S、D、......,屏幕上输出的第81个字符是字母( )。
A.A
B.S
C.D
D.a
【答案】:C
【解析】
ASDasd一循环,81%6=3,应该是第三个字符D
第7题
二进制数00101100和00010101的和( )。
A.00101000
B.01000001
C.01000100
D.00111000
【答案】:B
【解析】
同前几年的题,注意1+1要进位
第8题
与二进制小数0.1相等的八进制数是( )。
A.0.8
B.0.4
C.0.2
D.0.1
【答案】:B
【解析】
同2015年,先转成十进制,再转成八进制
\((0.1)_2=(0.5)_{10}=(0.4)_8\)
第9题
以下是32位机器和64位机器的区别是( )。
A.显示器不同
B.硬盘大小不同
C.寻址空间不同
D.输入法不同
【答案】:C
【解析】
指的是CPU最大处理位数,即内存最大寻址空间到\(2^{32}\)位,4GB。
第10题
以下关于字符串的判定语句中正确的是( )。
A.字符串是一种特殊的线性表
B.串的长度必须大于零
C.字符串不可以用数组来表示
D.空格字符组成的串就是空串
【答案】:A
【解析】
字符串的本质就是字符数组,C错误。B选项错,可以是空串。空格字符串是空格组成的字符串
第11题
一棵二叉树如右图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i,则其左孩子位于下标2i处、右孩子位于下标(2i+1)处),则图中所有结点的最大下标为( )。

A.6
B.10
C.12
D.15
【答案】:D
【解析】
左儿子是2i,右儿子是2i+1,最大下标是15
第12题
若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0)。
s=a;
for (b=1; b<=c; b++)
s = s + 1;
则与上述程序段修改s值的功能等价的赋值语句是( )。
A.s=a+b
B.s=a+c;
C.s=s+c;
D.s=b+c;
【答案】:B
【解析】
2013年原题,c个1就是c,所以等于a+c
第13题
有以下程序:
#include <iostream>
using namespace std;
int main()
{
int k=4, n=0;
while (n<k)
{
n++;
if(n%3!=0)
continue;
k--;
}
cout << k <<"," << n <<endl;
return 0;
}
程序运行后输出的结果是( )。
A.2,2
B.2,3
C.3,2
D.3,3
【答案】:D
【解析】
| n | 4 | |
|---|---|---|
| 初始 | 0 | 4 |
| 第1次 | 0/1 | 4 |
| 第2次 | 1/2 | 4 |
| 第3次 | 2/3 | 4/3 |
输出3和3
第14题
给定含有n个不同的数的数组L=<\(x_1, x_2,\dots, x_n\)>。如果L中存在\(x_i\)(1<i<n)使得\(x_1\lt x_2\lt \dots \lt x_{i-1}\lt x_i\gt x_{i+1}\gt \dots \gt x_n\),则称L是单峰的,并称\(x_i\)是 L 的“峰顶”。现在已知L是单峰的,请把a-c三行代码补全到算法中使得算法正确找到L的峰顶。
a.Search(k+1, n)
b.Search(1, k-1)
c.return L[k]
Search(1, n)
1. k←[n/2]
2. if L[k]>L[k-1] and L[k]>L[k+1]
3. then ____
4. else if L[k]>L[k+1] and L[k]<L[k+1]
5. then ____
6. else ____
正确的填空顺序是( )。
A.c,a,b
B.c,b,a
C.a,b,c
D.b,a,c
【答案】:A
【解析】
第2句表示如果找到了封顶,那么第3句就应该返回封顶。第4句表示第k点落在峰顶的左半边,所以需要从右边,即[k+1,n]进行查找
第15题
设简单无向图G有16条边且每个顶点的度数都是2,则图G有( )个顶点。
A.10
B.12
C.8
D.16
【答案】:D
【解析】
设顶点个数为x个,则有2x/2条边
第16题
有7个一模一样的苹果,放到3个一样的盘子中,一共有( )种放法。
A.7
B.8
C.21
D.\(3^7\)
【答案】:B
【解析】
之前8个球放5个袋子,也是类似的使用枚举方法
7个苹果放在一个盘子中:1(7 0 0)
7个苹果放在二个盘子中:3(6 1 0、5 2 0、4 3 0)
7个苹果放在三个盘子中:4(5 1 1、4 2 1、3 3 1、3 2 2)
第17题
下图表示一个果园灌溉系统,有A、B、C、D四个阀门,每个阀门可以打开或关上,所有管道粗细相同,以下设置阀门的方法中,可以让果树浇上水的是( )。

A.B打开,其他都关上
B.AB都打开,CD都关上
C.A打开,其他都关上
D.D打开,其他都关上
【答案】:A
【解析】
方案一:打开B,关上A
方案二:C、D打开
第18题
Lucia和她的朋友以及朋友的朋友都在某社交网站上注册了账号。下图是他们之间的关系图,两个人之间有边相连代表这两个人是朋友,没有边相连代表不是朋友。这个社交网站的规则是:如果某人A向他(她)的朋友B分享了某张照片,那么B就可以对该照片进行评论;如果B评论了该照片,那么他(她)的所有朋友都可以看见这个评论以及被评论的照片,但是不能对该照片进行评论(除非A也向他(她)分享了该照片)。现在Lucia已经上传了一张照片, 但是她不想让Jacob看见这张照片, 那么她可以向以下朋友( )分享该照片。

A.Dana, Michael, Eve
B.Dana, Eve, Monica
C.Michael, Eve, Jacob
D.Micheal, Peter, Monica
【答案】:A
【解析】
不能分享给Jacob,也不能分享给Jacob的朋友Lena、Peter、Monicat、Charles,所以BCD都是错误的。
第19题
周末小明和爸爸妈妈三个人一起想动手做三道菜。小明负责洗菜、爸爸负责切菜、妈妈负责炒菜。假设做每道菜的顺序都是:先洗菜10分钟,然后切菜10分钟,最后炒菜10分钟。那么做一道菜需要30分钟。注意:两道不同的菜的相同步骤不可以同时进行。例如第一道菜和第二道的菜不能同时洗,也不能同时切。那么做完三道菜的最短时间需要( )分钟。
A.90
B.60
C.50
D.40
【答案】:C
【解析】
0-10:小明洗菜1
10-20:小明洗菜2,爸爸切菜1
20-30:小明洗菜3,爸爸切菜2,妈妈炒菜1
30-40:爸爸切菜3,妈妈炒菜2
40-50:妈妈炒菜3
第20题
参加NOI比赛, 以下不能带入考场的是( )。
A.钢笔
B.适量的衣服
C.U盘
D.铅笔
【答案】:C
【解析】
同2014年,常识
问题求解
第21题
从一个4×4的棋盘(不可旋转)中选取不在同一行也不在同一列上的两个方格,共有种( )方法。
【答案】:72
【解析】
选第一个格子:16个
选第二个格子:9个
16 * 9 / 2 = 72
第22题
约定二叉树的根节点高度为1。一棵结点数为2016的二叉树最少有( )个叶子结点;一棵结点数为2016的二叉树最小的高度值是( )。
【答案】:1 11
【解析】
如果二叉树是2016层,那就只有1个叶子结点。
高度最小,属于完全二叉树,\(2^{n-1}-1\)<完全二叉树结点数<\(2^{n}-1\),n=11
阅读程序
#include <iostream>
using namespace std;
int main()
{
int max, min, sum, count = 0;
int tmp;
cin >> tmp;
if (tmp==0)
return 0;
max = min = sum = tmp;
count++;
while (tmp!=0)
{
cin >> tmp;
if (tmp!=0)
{
sum += tmp;
count++;
if (tmp>max)
max=tmp;
if (tmp<min)
min=tmp;
}
}
cout << max << ", " << min << ", " << sum/count << endl;
return 0;
}
第23题
输入:1 2 3 4 5 6 0 7
输出:( )
【答案】:6, 1, 3
【解析】
第15行表示读到0就结束,所以最后一个输入7没有读进来。
运行到最后max=6,min=1,sum=21,count=6。另外需要注意格式,","后面有一个空格
#include <iostream>
using namespace std;
int main()
{
int i=100, x=0, y=0;
while (i>0)
{
i--;
x = i%8;
if (x==1)
y++;
}
cout << y << endl;
return 0;
}
第24题
输出:( )
【答案】:13
【解析】
题目是求1~99之间有多少个数模8余1,一共13个。
#include <iostream>
using namespace std;
int main() {
int a[6] = {1,2,3,4,5,6};
int pi=0;
int pj=5;
int t, i;
while (pi<pj)
{
t = a[pi];
a[pi] = a[pj];
a[pj] = t;
pi++;
pj--;
}
for (i=0; i<6; i++)
cout << a[i] << ",";
cout << endl;
return 0;
}
第25题
输出:( )
【答案】:6,5,4,3,2,1,
【解析】
双指针模拟,注意最后“1”后面还有一个“,”
#include <iostream>
using namespace std;
int main()
{
int i, length1, length2;
string s1, s2;
s1 = "I have a dream.";
s2 = "I Have A Dream.";
length1 = s1.size();
length2 = s2.size();
for (i=0; i<length1; i++)
if (s1[i]>='a' && s1[i]<='z')
s1[i] -= 'a' - 'A';
for (i=0; i<length2; i++)
if (s2[i]>='a' && s2[i]<='z')
s2[i] -= 'a' - 'A';
if (s1==s2)
cout << "=" << endl;
else if (s1>s2)
cout << ">" << endl;
else
cout << "<" << endl;
return 0;
}
第26题
输出:( )
【答案】:=
【解析】
第12行至第13行,就是将小写字母转为大写字母。s1和s2最后都转为"I HAVE A DREAM.",判断为相等
完善程序
(读入整数)请完善下面的程序,使得程序能够读入两个int范围内的整数,并将这两个整数分别输出,每行一个。
输入的整数之间和前后只会出现空格或者回车。输入数据保证合法。
例如:
输入:
123
-789
输出:
123
-789
#include <iostream>
using namespace std;
int readint() {
int num = 0; // 存储读取到的整数
int negative = 0; // 负数标识
char c; // 存储当前读取到的字符
c = cin.get();
while ((c<'0' || c>'9') && c!='-')
c = __1__;
if (c=='-')
negative = 1;
else
__2__;
c = cin.get();
while (__3__) {
__4__;
c = cin.get();
}
if (negative == 1)
__5__;
return num;
}
int main()
{
int a, b;
a = readint();
b = readint();
cout << a << endl << b << endl;
return 0;
}
第27题
1处应填( )。
【答案】:c = cin.get()
【解析】
在第1个有效数字或'-'前可能出现很多非法字符,需要跳过
第28题
2处应填( )。
【答案】:num = c - '0'
【解析】
如果不是负数,则第1个字符就是数字本身
第29题
3处应填( )。
【答案】: c>='0' && c<='9'
【解析】
如果第15行读入的是个数字,则继续读入
第30题
4处应填( )。
【答案】:num = num * 10 + c-'0'
【解析】
计算num
第31题
5处应填( )。
【答案】:return -num
【解析】
返回负数
(郊游活动)有n名同学参加学校组织的郊游活动,已知学校给这n名同学的郊游总经费为A元,与此同时,第i位同学自己携带了Mi元。为了方便郊游,活动地点提供B(≥n)辆自行车供人租用。租用第j辆自行车的价格为Cj元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了翻遍账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。
本题采用二分法。对于区间[1,r],我们取中间点mid并判断租用自行车的人数能否达到mid。判断的过程是利用贪心算法实现的。
#include <iostream>
using namespace std;
#define MAXN 1000000
int n, B, A, M[MAXN], C[MAXN], l, r, ans, mid;
bool check(int nn) {
int count = 0, i, j;
i = __1__;
j = 1;
while (i<=n) {
if (__2__)
count += C[j]-M[i];
i++;
j++;
}
return __3__;
}
void sort(int a[], int l, int r) {
int i=1, j=r, x=a[(l+r)/2], y;
while (i<=j) {
while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j) {
y=a[i]; a[i]=a[j]; a[j]=y;
i++; j--;
}
}
if (i<r) sort(a, i, r);
if (l<j) sort(a, l, j);
}
int main() {
int i;
cin >> n >> B >> A;
for (i=1; i<=n; i++)
cin >> M[i];
for (i=1; i<=B; i++)
cin >> C[i];
sort(M, 1, n);
sort(C, 1, B);
l = 0;
r = n;
while (l<=r) {
mid = (l+r)/2;
if (__4__) {
ans = mid;
l = mid+1;
} else {
r = __5__;
}
}
cout << ans << endl;
return 0;
}
第32题
第一空填( )
【答案】:n-nn+1
【解析】
从第nn个人到第n个人是否可以租车
第33题
第二空填( )
【答案】:C[j]>=M[i]
【解析】
如果个人的前不足以支付,则用总经费
第34题
第三空填( )
【答案】:count <= A
【解析】
如果总花费小于等于总经费,就是可以的
第35题
第四空填( )
【答案】:check(mid)
【解析】
需要判断mid这个值是否成功
第36题
第五空填( )
【答案】:mid-1
【解析】
二分模板,对于false的情况,r = mid - 1,缩小区间

浙公网安备 33010602011771号