1

历年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)处),则图中所有结点的最大下标为( )。

image

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四个阀门,每个阀门可以打开或关上,所有管道粗细相同,以下设置阀门的方法中,可以让果树浇上水的是( )。

image

A.B打开,其他都关上

B.AB都打开,CD都关上

C.A打开,其他都关上

D.D打开,其他都关上

【答案】:A

【解析】

方案一:打开B,关上A

方案二:C、D打开

第18题

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

image

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,缩小区间

posted @ 2026-01-18 13:52  热爱编程的通信人  阅读(2)  评论(0)    收藏  举报