葫芦岛市网站建设_网站建设公司_营销型网站_seo优化
2026/1/18 13:44:39 网站建设 项目流程

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:历年CSP-J初赛真题解析 | 汇总_热爱编程的通信人的博客-CSDN博客


选择题

第1题

以下哪一种设备属于输出设备( )

A.扫描仪

B.键盘

C.鼠标

D.打印机

【答案】:D

【解析】

A、B、C都是输入设备

第2题

下列四个不同进制的数中,与其它三项数值上不相等的是( )

A.\((269)_{16}\)

B.\((617)_{10}\)

C.\((1151)_8\)

D.\((1001101011)_2\)

【答案】:D

【解析】

十六进制和八进制优先转为二进制后比较,可以发现A和C相同,与D不同,故选D

第3题

1MB等于( )

A.1000字节

B.1024字节

C.1000 X 1000字节

D.1024 X 1024字节

【答案】:D

【解析】

\(1MB = 2^{10}KB = 2^{20}B\)

第4题

广域网的英文缩写是( )

A.LAN

B.WAN

C.MAN

D.LNA

【答案】:B

【解析】

WAN:Wide Area Network

LAN:Local Area Network

MAN:Metro Area Network

LNA:局部网络结构 Local Network Architecture

第5题

中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。

A.1983

B.1984

C.1985

D.1986

【答案】:B

【解析】

计算机常识

第6题

如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照CapsLock、字母键A、字母键S、字母键D、字母键F的顺序循环按键, 即CapsLock、A、S、D、F、CapsLock、A、S、D、F、......,屏幕上输出的第81个字符是字母( )

A.A

B.S

C.D

D.a

【答案】:A

【解析】

之前的原题,这次多了个字符F。

ASDFasdfASDFasdf,8个一循环,81%8=1,第1个字符就是A

第7题

根节点深度为0,一棵深度为h的满k(k>1)叉树,即除最后一层无任何子节点外,每一层上的所有结点都有k个子结点的树,共有( )个结点。

A.\((k^{h+1}-1)/(k-1)\)

B.\(k^h-1\)
C.\(k^h\)
D.\((k^{h-1})/(k-1)\)

【答案】:A

【解析】

等比数列求和公式:\(S_n = \frac{a_1(q^n-1)}{q-1}\),这里公比为k,\(S_n = \frac{1*(k^{h+1}-1)}{k-1}\)

第8题

以下排序算法中,不需要进行关键字比较操作的算法是( )。

A.基数排序

B.冒泡排序

C.堆排序

D.直接插入排序

【答案】:A

【解析】

B、C、D一定需要进行比较的。基数排序是桶排序,直接放到下标中,自动做了比较。

第9题

给定一个含N个不相同数字的数组,在最坏情况下,找出其中最大或最小的数,至少需要N-1次比较操作。则最坏情况下,在该数组中同时找最大与最小的数至少需要( )次比较操作。(\(\lceil \rceil\)表示向上取整,\(\lfloor \rfloor\)表示向下取整)

A.\(\lceil 3N/2\rceil-2\)

B.\(\lfloor 3N/2 \rfloor-2\)

C.2N-2

D.2N-4

【答案】:A

【解析】

n为奇数时,\(a_1,a_2,\dots,a_{n-1},a_n\)

第1步:使MAX初值为\(a_1\)

第2步:每一组组内比较,求出较大者(比较(n-1)/2次)

第3步:将每一组的较大者与MAX比较,求出最大值(比较(n-1)/2次)

同理求最小值,得到组内较大值和较小值可以只要(n-1)/2次,后面求最大值和最小值分别需要(n-1)/2次,所以共需3*(n-1)/2, 即3n/2-3/2=\(\frac{3n+1}{2}-2\)

n为偶数时,\(a_1,a_2,\dots,a_{n-1},a_n\)

第1步:使MAX初始为\(a_1\)\(a_2\)的较大值,MIN则是较小值(需1次比较)

第2步:每一组组内比较,同时求出较大者和较小者(比较(n-2)/2次)

第3步:将每一组的较大者与MAX、MIN比较,求出最大值(比较2*(n-2)/2次)

共需3*(n-2)/2+1=3n/2-2=\(\frac{3n}{2}-2\)

综上,结果为\(\lceil \frac{3n}{2}\rceil-2\)

第10题

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

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

A.枚举

B.递归

C.贪心

D.分治

【答案】:B

【解析】

2013年原题,递归

第11题

由四个没有区别的点构成的简单无向连通图的个数是( )。

A.6

B.7

C.8

D.9

【答案】:A

【解析】

4个无区别的点,所以某个图的各个顶点的度数相同,则为同一个图形,如2332和2323。

6条边1种:3333

5条边1种:2332

4条边2种:2222、2231

3条边2种:1221、1311

第12题

设含有10个元素的集合的全部子集数为S,其中由7个元素组成的子集数为T,则T/S的值为( )。

A.5 / 32

B.15 / 128

C.1 / 8

D.21 / 128

【答案】:B

【解析】

T = 10个中挑7个的组成数 = \(C_{10}^{3}\)=120

S = \(2^{10}\)

T/S = 15/128

第13题

10000以内,与10000互质的正整数有( )个。

A.2000

B.4000

C.6000

D.8000

【答案】:B

【解析】

10000以内因数含2的数有5000个,因数含5的数有2000个,因数含10的数有1000个

10000-5000-2000+1000=4000

第14题

为了统计一个非负整数的二进制形式中1的个数,代码如下:

int CountBit(int x)
{int ret = 0;while (x){ret++;____;}return ret;
}

则空格内要填入的语句是( )。

A.x>>=1

B.x&=x-1

C.x|=x>>1

D.x<<=1

【答案】:B

【解析】

假设x为5,A选项结果为3,B选项结果为2,C选项死循环,D选项结果为3

第15题

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

image

A.哈希表

B.栈

C.队列

D.二叉树

【答案】:栈

【解析】

2013年原题

问题求解

第16题

甲乙丙丁四人在考虑周末要不要外出郊游。
已知①如果周末下雨,并且乙不去,则甲一定不去;②如果乙去,则丁一定去;③如果丙去,则丁一定不去;④如果丁不去,而且甲不去,则丙一定不去。如果周末丙去了,则甲( )(去了/没去),乙( )(去了/没去),丁( )(去了/没去),周末( )(下雨/没下雨)。

【答案】:去了 没去 没去 没下雨

【解析】

题目给出丙去了,先看第3条确定丁没去,再根据第2条确定乙没去,根据第4条确定甲去了,再看第1条,周末不下雨

第17题

从1到2018这2018个数中,共有( )个包含数字8的数。

包含数字8的数是指有某一位是“8”的数,例如“2018”与“188”

【答案】:544

【解析】

1-10:1个

11-79:7个

80-89:10个

90-99:1个

推出1-99:19个,100-799:197个,800-899:100个,900-999:19个,1-999:199+100=271个

1000-1999也是271个。

2000-2018是2个。

阅读程序

#include <stdio.h>
char st[100];int main() {scanf("%s", st);for (int i=0; st[i]; ++i) {if ('A' <= st[i] && st[i] <= 'Z')st[i]+=1;}printf("%s\n", st);return 0;
}

第18题

输入:QuanGuoLianSai

输出:( )

【答案】:RuanHuoMianTai

【解析】

第6行代码的st[i]用来判断是否到达字符串的末尾。

题目的目的是判断大写字母后,将字母变为后一个字母

#include <stdio.h>
int main() {int x;scanf("%d", &x);int res = 0;for (int i=0; i<x; ++i) {if (i * i % x == 1) {++res;}}printf("%d", res);return 0;
}

第19题

输入:15

输出:( )

【答案】:4

【解析】

题目是求i的平方模x为1的数的数量。0~14之间有1、4、11、14一共4个数

#include <iostream>
using namespace std;
int n, m;int findans(int n, int m) {if (n==0) return m;if (m==0) return n % 3;return findans(n-1, m) - findans(n, m-1) + findans(n-1, m-1);
}int main() {cin >> n >> m;cout << findans(n, m) << endl;return 0;
}

第20题

输入:5 6

输出:( )

【答案】:8

【解析】

可以把题目理解为递推,递推式f[n][m] = f[n-1][m] - f[n][m-1] + f[n-1][m-1]

n\m 0 1 2 3 4 5 6
0 0 1 2 3 4 5 6
1 1 0 3 2 5 4 7
2 2 -1 4 1 6 3 8
3 0 1 2 3 4 5 6
4 1 0 3 2 5 4 7
5 2 -1 4 1 6 3 8

则f[5][6]=8

#include <stdio.h>
int n, d[100];
bool v[100];int main() {scanf("%d", &n);for (int i=0; i<n; ++i) {scanf("%d", d+i);v[i] = false;}int cnt = 0;for (int i=0; i<n; ++i) {if (!v[i]) {for (int j=i; !v[j]; j=d[j]) {v[j] = true;}++cnt;}}printf("%d\n", cnt);return 0;
}

第21题

输入:10 7 1 4 3 2 5 9 8 0 6

输出:( )

【答案】:6

【解析】

先从模拟程序的运行入手,d[10]={7,1,4,3,2,5,9,8,0,6}


0 1 2 3 4 5 6 7 8 9
d 7 1 4 3 2 5 9 8 0 6
v

0 0 0 0 0 0 0 0 0 0 cnt
i=0 1 1 1 1
i=1 1 2
i=2 1 1 3
i=3 1 4
i=4 4
i=5 1
5
i=6
1 1 6
i=7 6
i=8 6
i=9 6

题目是图论的一个概念,根据点与点之间的连线,可以画出有向图,这个图的连通分量是6

完善程序

(最大公约数之和)下列程序想要求解整数n的所有约数两两之间最大公约数的和对10007求余后的值,试补全程序。

举例来说,4的所有约数是1,2,4。1和2的最大公约数为1;2和4的最大公约数为2;1和4的最大公约数为1。于是答案为1+2+1=4。

要求getDivisor函数的复杂度为\(O(\sqrt n)\) , gcd函数的复杂度为\(O(log\ max(a,b))\)

#include <iostream>
using namespace std;const int N = 110000, P = 10007;
int n;
int a[N], len;
int ans;void getDivisor() {len = 0;for (int i=1; __1__<=n; ++i) if (n%i==0) {a[++len] = i;if (__2__!=i) a[++len] = n/i;}
}int gcd(int a, int b) {if (b==0) {__3__;}return gcd(b, __4__);
}int main() {cin >> n;getDivisor();ans = 0;for (int i=1; i<=len; ++i) {for (int j=i+1; j<=len; ++j) {ans = (__5__) % p;}}cout << ans << endl;
}

第22题

1处应该填( )。

【答案】:i*i

【解析】

因为时间复杂度要求\(O(\sqrt n)\),所以不能i<n,只能i*i<n

第23题

2处应该填( )。

【答案】:n/i

【解析】

保存n/i,如果n/i==i,上面已经存过一次,所以这里无需再存

第24题

3处应该填( )。

【答案】:return a

【解析】

辗转相除求最大公约数的板子

第25题

4处应该填( )。

【答案】:a%b

【解析】

辗转相除求最大公约数的板子

第26题

5处应该填( )。

【答案】:ans+gcd(i,j)

【解析】

求i和j的最大公约数,所以是gcd(a[i],a[j]),另外需要累加结果,所以是ans+gcd(a[i],a[j])

对于一个1到n的排列P(即1到n中每一个数在P中出现了恰好一次),令q[i]为第i个位置之后第一个比P[i]值更大的位置,如果不存在这样的位置,则q[i]=n+1。

举例来说,如果n=5且P为1 5 4 2 3,则q为2 6 6 5 6。

下列程序读入了排列P,使用双向链表求解了答案。试补全程序。

数据范围\(1\le n\le 10^5\)

#include <iostream>
using namespace std;const int N = 100010;
int n;
int L[N], R[N], a[N];int main() {cin >> n;for (int i=1; i<=n; ++i) {int x;cin >> x;__1__;}for (int i=1; i<=n; ++i) {R[i] = __2__;L[i] = i-1;}for (int i=1; i<=n; ++i) {L[__3__] = L[a[i]];R[L[a[i]]] = R[__4__];}for (int i=1; i<=n; ++i) {cout << __5__ << " ";}cout << endl;return 0;
}

第27题

1处应该填( )

【答案】:a[x] = i

【解析】

记录每个数字在哪一个位置,后面需要从小到大枚举每个数字进行更新

第28题

2处应该填( )

【答案】:i+1

【解析】

下一行记录i左边的值,所以这行是记录i右边的值

第29题

3处应该填( )

【答案】:R[a[i]]

【解析】

将R[a[i]]的左边指向a[i]的左边,变相的删除a[i]

第30题

4处应该填( )

【答案】:a[i]

【解析】

将L[a[i]]的右边指向a[i]的右边,变相的删除a[i]

第31题

5处应该填( )

【答案】:R[i]

【解析】

此时L[i]记录的是i左边第一个比它大的数,R[i]记录的是右边第一个比它大的数

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询