历年CSP-J初赛真题解析 | 2013年CSP-J初赛

附上汇总帖:历年CSP-J初赛真题解析 | 汇总

单项选择题

第1题

一个32位整型变量占用( )个字节。

A.4

B..8

C.32

D.128

【答案】:A

【解析】

基本单位是字节,位是最小单位。1个字节8位,32位就是4个字节

第2题

二进制数11.01在十进制下是( )。

A.3.25

B.4.125

C.6.25

D.11.125

【答案】:A

【解析】

\(2^1+2^0+2^{-1}+2^{-2}=3.25\)

第3题

下面的故事与( )算法有着异曲同工之妙。

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事....

A.枚举

B.递归

C.贪心

D.分治

【答案】:B

【解析】

自己调用自己

第4题

逻辑表达式( )的值与变量A的真假无关。

A.\((A\lor B)\land \lnot A\)

B.\((A\lor B)\land \lnot B\)

C.\((A\land B)\lor (\lnot A\land B)\)

D.\((A\lor B)\land \lnot A\land B\)

【答案】:C

【解析】

A=0,B=0 A=1,B=0 A=0,B=1 A=1,B=1
\((A\lor B)\land \lnot A\) 0 0 1 0
\((A\lor B)\land \lnot B\) 0 1
\((A\land B)\lor (\lnot A\land B)\) 0 0 1 1
\((A\lor B)\land \lnot A\land B\)

第5题

将(2,6,10,17)分别存储到某个地址区间为0~10的哈希表中,如果哈希函数h(x)=( ), 将不会产生冲突, 其中a mod b表示a除以b的余数。

A.x mod 11

B.\(x^2\) mod 11

C.2x mod 11

D.\(\lfloor \sqrt x\rfloor\) mod 11, 其中\(\lfloor \ \rfloor\)表示向下取整

【答案】:D

【解析】

哈希表(散列表),根绝关键码值直接访问的数据结构(根据计算结果从小到大存入),不冲突表示h(x)计算结果不同

2 6 10 17
x mod 11 2 6 10 6
\(x^2\) mod 11 4 3 1 3
2x mod 11 4 1 9 1
\(\lfloor \sqrt x\rfloor\) mod 11 1 2 3 4

第6题

在十六进制表示法中,字母A相当于十进制中的( )。

A.9

B.10

C.15

D.16

【答案】:B

【解析】

16进制0,1,2,3,4,5,6,7,8,9,A,B,C,D,E对应10进制0~15

第7题

下图中所使用的数据结构是( )。

在这里插入图片描述

A.哈希表

B.栈

C.队列

D.二叉树

【答案】:B

【解析】

后进先出的数据结构,属于栈

第8题

在Windows资源管理器中, 用鼠标右键单击一个文件时, 会出现一个名为“复制”的操作选项,它的意思是( )。

A.用剪切板中的文件替换该文件

B.在该文件所在文件夹中,将该文件克隆一份

C.将该文件复制到剪切板,并保留原文件

D.将该文件复制到剪切板,并删除原文件

【答案】:C

【解析】

复制,文件保留

第9题

已知一棵二叉树有10个节点,则其中至多有( )个节点有2个子节点。

A.4

B.5

C.6

D.7

【答案】:A

【解析】

设有x个节点有2个子节点,则至少还有2x个节点,这2x个节点可能与前x个节点重合,最多重合x-1个,则整棵树最少有x+2x-(x-1)=2x+1个,2x+1≤10,解得x=4

第10题

在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通图。下图是一个有4个顶点、6条边的连通图。若要使它不再是连通图,至少要删去其中的( )条1边。

在这里插入图片描述

A.1

B.2

C.3

D.4

【答案】:C

【解析】

每个节点有都3条边与别的节点相连,至少删3条边

第11题

二叉树的( )第一个访问的节点是根节点。

A.先序遍历

B.中序遍历

C.后序遍历

D.以上都是

【答案】:A

【解析】

先序遍历:根左右,中序遍历:左根右,后续遍历:左右根

第12题

以A0作为起点,对下面的无向图进行深度优先遍历时,遍历顺序不可能是( )。

在这里插入图片描述

A.A0,A1,A2,A3

B.A0,A1,A3,A2

C.A0,A2,A1,A3

D.A0,A3,A1,A2

【答案】:A

【解析】

A0, A1, A3, A2

A0, A3, A1, A2

A0, A2, A1, A3

A0, A2, A3, A1

访问A1后没有到底,不能访问A2

第13题

IPv4协议使用32位地址, 随着其不断被分配, 地址资源日趋枯竭。因此它正逐渐被使用( )位地址的IPv6协议所取代。

A.40

B.48

C.64

D.128

【答案】:D

【解析】

IPv6地址是128位

第14题

( )的平均时间复杂度为O(nlogn) , 其中n是待排序的元素个数。

A.快速排序

B.插入排序

C.冒泡排序

D.基数排序

【答案】:A

【解析】

快排的时间复杂度就是O(nlogn),插入和冒泡的平均时间复杂度是\(O(n^2)\),基数排序由待排数字的位数决定

第15题

下面是根据欧几里得算法编写的函数,它所计算的是a和b的( )。

int euclid(int a, int b) {
    if (b==0)
        return a;
    else
        return euelid(b, a%b);
}

A.最大公共质因子

B.最小公共质因子

C.最大公约数

D.最小公倍数

【答案】:C

【解析】

辗转相除法求最大公约数

第16题

通常在搜索引擎中,对某个关键词加上双引号表示( )。

A.排除关键词,不显示任何包含该关键词的结果

B.将关键词分解,在搜索结果中必须包含其中的一部分

C.精确搜索,只显示包含整个关键词的结果

D.站内搜索,只显示关键词所指向网站的内容

【答案】:C

【解析】

加双引号是为了严格匹配搜索

第17题

中国的国家顶级域名是( )。

A.cn

B.ch

C.chn

D.china

【答案】:A

【解析】

.cn是中国顶级域名,china的简写。.ch是瑞士的

第18题

把64位非零浮点数强制转换成32位浮点数后,不可能( )。

A.大于原数

B.小于原数

C.等于原数

D.与原数符号相反

【答案】:D

【解析】

浮点数由符号位、尾码、解码组成,double类型转为float,符号位不变,精确位数不确定

第19题

下列程序中, 正确计算1, 2, …, 100这100个自然数之和sum(初始值为0)的是( )。

A.A

B.B

C.C

D.D

【答案】:A

【解析】

i必须要≤100,只有A选项满足

第20题

CCF NOIP复赛全国统一评测时使用的系统软件是( )。

A.NOI Windows

B.NOI Linux

C.NOI MacOS

D.NOI DOS

【答案】:B

【解析】

NOI Linux(北航开发的)

问题求解

第21题

7个同学围坐一圈,要选2个不相邻的作为代表,有( )种不同的选法。

【答案】:14

【解析】

多少个不相邻的代表,就是求n边行有多少条对角线,n*(n-3)/2=14

第22题

某系统自称使用了一种防窃听的方式验证用户密码。密码是n个数\(s_1,s_2,\dots,s_n\), 均为0或1。该系统每次随机生成n个数\(a_1,a_2,\dots,a_n\), 均为0或1, 请用户回答\(s_1a_1+s_2a_2+\dots +s_na_n\)除以2的余数。如果多次的回答总是正确,即认为掌握密码。该系统认为,即使问答的过程被泄露,也无助于破解密码——因为用户并没有直接发送密码。

然而,事与愿违。例如,当n=4时,有人窃听了以下5次问答:

在这里插入图片描述

就破解出了密码=\(s_1\)( ),\(s_2\)( ),\(s_3\)( ),\(s_4\)( )。

【答案】:0 1 1 1

【解析】

第1组:(s1 + s2) mod 2 = 1 -> s2=1(2)

第2组:(s3 + s4) mod 2 = 0 -> s4=1(4)

第3组:(s2 + s3 + s4 ) mod 2 = 0

第4组:(s1+s2+s3) mod 2 = 0 -> s3=1(3)

第5组:s1 mod 2 = 0 -> s1=0(1)

阅读程序

#include <iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a >> b;
    cout << a << "+" << b << "=" << a+b << endl;
}

第23题

输入:3 5

输出:( )

【答案】:3+5=8

【解析】

(简单),注意格式,输出内容中没有空格

#include <iostream>
using namespace std;
int main() {
    int a, b, u, i, num;
    cin >> a >> b >> u;
    num = 0;
    for (i=a; i<=b; i++)
        if ((i%u)==0) num++;
    cout << num << endl;
    return 0;
}

第24题

输入:1 100 15

输出:( )

【答案】:6

【解析】

在1到100中,如果是u的倍数,num++,答案为6

#include <iostream>
using namespace std;
int main() {
    const int SIZE = 100;
    int n, f, i, left, right, middle, a[SIZE];
    cin >> n >> f;
    for (i=1; i<=n; i++)
        cin >> a[i];
    left = 1;
    right = n;
    do {
        middle = (left+right) / 2;
        if (f<=a[middle])
            right = middle;
        else 
            left = middle + 1;
    } while (left < right);
    cout << left << endl;
    return 0;
}

第25题

输入:

12 17

2 4 6 9 11 15 17 18 19 20 21 25

输出:( )

【答案】:7

【解析】

二分法,查找f那个数字所在的下标

#include <iostream>
using namespace std;
int main() {
    const int SIZE=100;
    int height[SIZE], num[SIZE], n, ans;
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> height[i];
        num[i] = 1;
        for (int j=0; j<i; j++) {
            if ((height[j]<height[i]) && (num[j]>=num[i]))
                num[i] = num[j] + 1;
        }
    }
    ans = 0;
    for (int i=0; i<n; i++) {
        if (num[i]>ans) ans = num[i];
    }
    cout << ans << endl;
}

第26题

输入:

6

2 5 3 11 12 4

输出:( )

【答案】:4

【解析】

求最长上升子序列

代码7-12行求出num数组:1 2 2 3 4 3

代码16-17用来求num数组中的最大值,为4

完善程序

(序列重排)全局数组变量a定义如下:

cosnt int SIZE=100;
int a[SIZE], n;

它记录着一个长度为n的序列a[1],a[2],...,a[n]。

现在需要一个函数,以整数p(1≤p≤n)为参数,实现如下功能:将序列a的前p个数与后n-p个数对调,且不改变这p个数(或n-p个数)之间的相对位置。例如,长度为5的序列1,2,3,4,5,当p=2时重排结果为3,4,5, 1,2。

有一种;朴素的算法可以实现这一需求,其时间复杂度为O(n),空间复杂度为O(n)。

void swap(int p) {
    int i, j, b[SIZE];
    for (i=1; i<=p; i++)
        b[__1__] = a[i];
    for (i=p+1; i<=n; i++)
        b[i-p] = __2__;
    for (i=1; i<=__3__; i++)
        a[i] = b[i];
}

我们也可以利用时间换空间,使用时间复杂度为\(O(n^2)\),空间复杂度为O(1)的算法:

void swap2(int p) {
    int i, j, temp;
    for (i=p+1; i<=n; i++) {
        temp = a[i];
        for (j=i; j>=__4__; j--)
            a[j] = a[j-1];
        __5__ = temp;
    }
}

第27题

第一空填( )。

【答案】:n-p+i

【解析】

a[1] -> b[n-p+1]

...

a[n] -> b[p]

a和b的下标的差值保持一致,所以a[i] -> b[p-n+i]

第28题

第二空填( )。

【答案】:a[i]

【解析】

a[p+1] -> b[1]

...

a[n] -> b[n-p]

a和b的下标的差值保持一致,所以a[i] -> b[i-p]

第29题

第三空填( )。

【答案】:n

【解析】

需要将b数组的内容重新拷贝回a数组中

第30题

第四空填( )。

【答案】:i-p+1

【解析】

每次挪动一部分单元格向右移一位

第一次挪动:a[1]~a[p]

第二次挪动:a[2]~a[p+1]

元素个数为p个,所以对于a[?]~a[i],?=i-p+1

第31题

第五空填( )。

【答案】:i-p

【解析】

a[p+1] -> a[1]

a[p+2] -> a[2]

...

a[i] -> a[i-p]

(二叉查找)二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于其右子树上所有节点的值。试判断一个树是否为二叉查找树。

输入的第一行包含一个整数n,表示这棵树有n个顶点,编号分别为1,2,...,n,其中编号为1的为根节点。之后的第i行有三个数value,left_child,right_child,分别表示该节点关键字的值,左子节点的编号,右子节点的编号;如果不存在左子节点或右子节点,则用0代替。输出1表示这棵树是二叉查找树,输出0则表示不是。

#include <iostream>
using namespace std;
const int SIZE=100;
const int INFINITE=1000000;
struct node {
    int left_child, right_child, value;
};
node a[SIZE];
int is_bst(int root, int lower_bound, int upper_bound) {
	int cur;
    if (root==0) return 1;
    cur = a[root].value;
    if ((cur>lower_bound) && (__1__) && 
        (is_bst(a[root].left_child, lower_bound, cur)==1) && 
        (is_bst(__2__, __3__, __4__)==1))
            return 1;
    return 0;
}
int main()
{
    int i, n;
    cin >> n;
    for (i=1; i<=n; i++)
        cin >> a[i].value >> a[i].left_child >> a[i].right_child;
    cout << is_bst(__5__, -INFINITE, INFINITE) << endl;
    return 0;
}

第32题

1处填:( )

【答案】:cur<upper_bound

【解析】

每个子树的根的值一定要大于其左子树,且小于右子树

第33题

2处填:( )

【答案】:a[root].right_child

【解析】

以右子树的节点作为其下层递归的根节点

第34题

3处填:( )

【答案】:cur

【解析】

左边界设置为cur

第35题

4处填:( )

【答案】:upper_bound

【解析】

右边界保持之前upper_bound

第36题

5处填:( )

【答案】:1

【解析】

以1为根节点进行搜索

posted @ 2026-06-11 16:45  团爸讲算法  阅读(21)  评论(0)    收藏  举报