历年CSP-J初赛真题解析 | 2014年CSP-J初赛
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_热爱编程的通信人的博客-CSDN博客
单项选择
第1题
以下哪个是面向对象的高级语言( )。
A.汇编语言
B.C++
C.Fortran
D.Basic
【答案】:B
【解析】
高级语言对人类更友好,如C/C++/Python/Pascal/Fortran/Basic。Fortran/Baisc/C都是面向过程的语言
第2题
1TB代表的字节数是( )。
A.2的10次方
B.2的20次方
C.2的30次方
D.2的40次方
【答案】:D
【解析】
\(1TB=1024(G)*1024(M)*1024(K)*1024=2^{40}B\)
第3题
二进制数00100100和00010101的和是( )。
A.00101000
B.001010100
C.01000101
D.00111001
【答案】:D
【解析】
按位加,1+1需要进位
第4题
以下哪一种设备属于输出设备( )。
A.扫描仪
B.键盘
C.鼠标
D.打印机
【答案】:D
【解析】
A/B/C都是输入设备
第5题
下列对操作系统功能的描述最为完整的是( )。
A.负责外设与主机之间的信息交换
B.负责诊断机器的故障
C.控制和管理计算机系统的各种硬件和软件资源的使用
D.将源程序编译成目标程序
【答案】:C
【解析】
A是接口的功能,B是操作系统部分功能,如BIOS的功能,D是编译器功能
第6题
CPU、存储器、I/O设备是通过( )连接起来的。
A.接口
B.总线
C.控制线
D.系统文件
【答案】:B
【解析】
接口是连接外部设备,主机内部是通过主板上的总线连接起来的
第7题
断电后会丢失数据的存储器是( )
A.RAM
B.ROM
C.硬盘
D.光盘
【答案】:A
【解析】
RAM(Random Access Memory)是随机存取存储器,断电后会消失。ROM(Read Only Memory)是只读存储器,断电后不会消失。BIOS程序就是放在ROM中。
第8题
以下哪一种是属于电子邮件收发的协议( )。
A.SMTP
B.UDP
C.P2P
D.FTP
【答案】:A
【解析】
电子邮件协议:SMTP和POP3
第9题
下列选项中不属于图像格式的是( )。
A.JPEG格式
B.TXT格式
C.GIF格式
D.PNG格式
【答案】:B
【解析】
txt是文本格式
第10题
链表不具有的特点是( )。
A.不必事先估计存储空间
B.可随机访问任一元素
C.插入删除不需要移动元素
D.所需空间与线性表长度成正比
【答案】:B
【解析】
数组可以随机访问,但链表需要从头遍历
第11题
下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( )。
A.296
B.1133
C.256
D.199
【答案】:D
【解析】
8位:\(2^8\)个,0~255
第12题
下列几个32位IP地址中,书写错误的是( )。
A.162.105.135.27
B.192.168.0.1
C.256.256.129.1
D.10.0.0.1
【答案】:C
【解析】
IPv4中4个数字,最多只能到255
第13题
要求以下程序的功能是计算:s=1+1/2+1/3+...+1/10。
#include <iostream>
using namespace std;
int main() {
int n;
float s;
s = 1.0;
for (n=10; n>1; n--)
s = s + 1/n;
cout << s <<endl;
return 0;
}
程序运行后输出结果错误,导致错误结果的程序行是( )。
A.s=1.0;
B.for(n=10; n>1; n--)
C.s=s+1/n;
D.cout<<s<<endl;
【答案】:C
【解析】
初值已经是1了,所以B答案没错,只需要加到1/2。1/n结果是整形,需要写成1.0/n
第14题
设变量x为float型且已赋值, 则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是( )。
A.\(x=(x*100)+0.5/100.0;\)
B.\(x=(x*100+0.5)/100.0;\)
C.\(x=(int)(x*100+0.5)/100.0;\)
D.\(x=(x*100+0.5)*100.0;\)
【答案】:C
【解析】
可以代入12.3456,计算发现C选项正确
第15题
有以下程序:
#include <iostream>
using namespace std;
int main() {
int s, a, n;
s = 0;
a = 1;
cin >> n;
do {
s+=1;
a-=2;
} while (a!=n);
cout << s <<endl;
return 0;
}
若要使程序的输出值为2,则应该从键盘给n输入的值是( )。
A.-1
B.-3
C.-5
D.0
【答案】:B
【解析】
s=2,a=-3。如果要a==n结束循环,那么n就需要等于-3
第16题
一棵具有5层的满二叉树中结点数为( )。
A.31
B.32
C.33
D.16
【答案】:A
【解析】
\(2^n-1\),n为5,结点数为31
第17题
有向图中每个顶点的度等于该顶点的( )。
A.入度
B.出度
C.入度和出度之和
D.入度和出度之差
【答案】:C
【解析】
基本概念,有向图中顶点的度为入度和出度之和
第18题
设有100个数据元素,采用折半搜索时,最大比较次数为( )。
A.6
B.7
C.8
D.10
【答案】:B
【解析】
log100=7
1次50,2次25,3次13(最大比较次数),4次7,5次4,6次2,7次1
第19题
若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值,c>0。
s = a;
for (b=1; b<=c; b++)
s += 1;
则与上述程序段功能等价的赋值语句是( )。
A.s=a+b
B.s=a+c
C.s=s+c
D.s=b+c
【答案】:B
【解析】
循环c次,每次加1,相当于a+c
第20题
计算机界的最高奖是( )。
A.菲尔兹奖
B.诺贝尔奖
C.图灵奖
D.普利策奖
【答案】:C
【解析】
菲尔兹是数学届,诺贝尔有五个奖,普利策是摄影界
问题求解
第21题
把M个同样的球放到N个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的放置方法?(用K表示)
例如:M=7,N=3时,K=8;在这里认为(5,1,1)和(1,5,1)是同一种放置方法。
问:M=8,N=5时,K=( )。
【答案】:18
【解析】
(初赛中直接用枚举法)
8个球装入1个袋中:1(8)
8个球装入2个袋中:4(1+7、2+6、3+5、4+4)
8个球装入3个袋中:5(1+1+6、1+2+5、1+3+4、2+2+4、2+3+3)
8个球装入4个袋中:5(1+1+1+5、1+1+2+4、1+1+3+3、1+2+2+3、2+2+2+2)
8个球装入5个袋中:3(1+1+1+1+4、1+1+1+2+3、1+1+2+2+2)
第22题
如图所示,图中每条边上的数字表示该边的长度,则从A到E的最短距离是( )。

【答案】:11
【解析】
用Dijstra来求,也可以直接看出结果:3+1+1+6=11
| 点标号 | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 从A触发到每个点的最短距离 | 0 | \(+\infty\) | \(+\infty\) | \(+\infty\) | \(+\infty\) | \(+\infty\) | \(+\infty\) |
| 点标号 | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 从A触发到每个点的最短距离 | 0 | 3 | \(+\infty\) | \(+\infty\) | \(+\infty\) | 6 | 4 |
| 点标号 | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 从A触发到每个点的最短距离 | 0 | 3 | 4 | 8 | 12 | 6 | 4 |
| 点标号 | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 从A触发到每个点的最短距离 | 0 | 3 | 4 | 8 | 12 | 5 | 4 |
| 点标号 | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 从A触发到每个点的最短距离 | 0 | 3 | 4 | 8 | 11 | 5 | 4 |
阅读程序
#include <iostream>
using namespace std;
int main() {
int a, b, c, d, ans;
cin >> a >> b >> c;
d = a-b;
a = d+c;
ans = a*b;
cout << "Ans=" << ans << endl;
return 0;
}
第23题
输入:2 3 4
输出:( )
【答案】:Ans=9
【解析】
模拟代入运算,注意输出格式不含空格
#include <iostream>
using namespace std;
int fun(int n) {
if (n==1) return 1;
if (n==2) return 2;
return fun(n-2) - fun(n-1);
}
int main() {
int n;
cin >> n;
cout << fun(n) << endl;
return 0;
}
第24题
输入:7
输出:( )
【答案】:-11
【解析】
fun(7)=fun(5)-fun(6),...,fun(3)=fun(1)-fun(2)
计算结果fun(7)=-11
#include <iostream>
#include <string>
using namespace std;
int main() {
string st;
int i, len;
getline(cin, st);
len = st.size();
for (i=0; i<len; i++) {
if (st[i]>='a' && st[i]<='z')
st[i]=st[i]-'a'+'A';
}
cout << st << endl;
return 0;
}
第25题
输入:Hello, my name is Lostmonkey.
输出:( )
【答案】:HELLO, MY NAME IS LOSTMONKEY.
【解析】
第10到第11行,就是将小写字母转为大写字母
#include <iostream>
using namespace std;
const int SIZE=100;
int main() {
int p[SIZE];
int n, tot, i, cn;
tot = 0;
cin >> n;
for (i=1; i<=n; i++) p[i] = 1;
for (i=2; i<=n; i++) {
if (p[i]==1) tot++;
cn = i*2;
while (cn<=n) {
p[cn] = 0;
cn += i;
}
}
cout << tot << endl;
return 0;
}
第26题
输入:30
输出:( )
【答案】:10
【解析】
第13至第16行,是为了将i的倍数都置为0。只有质数不是任何数的倍数。30以内的质数有2,3,5,7,11,13,17,19,23,29,共10个
完善程序
(数字删除)下面程序的功能是将字符串中的数字字符删除后输出。请填空。
#include <iostream>
using namespace std;
int delnum(char *s) {
int i, j;
j = 0;
for (i=0; s[i]!='\0'; i++)
if (s[i]<'0' __1__ s[i]>'9') {
s[j] = s[i];
__2__;
}
return __3__;
}
const int SIZE = 30;
int main() {
char s[SIZE];
int len, i;
cin.getline(s, sizeof(s));
len = delnum(s);
for (i=0; i<len; i++) cout << __4__;
cout << endl;
return 0;
}
第27题
1处填:( )
【答案】:||
【解析】
目的是判断非数字的字符,保留下来
第28题
2处填:( )
【答案】:j++
【解析】
非数字字符也存在s中,使用j下标来记录
第29题
3处填:( )
【答案】:j
【解析】
最后一个非数字字符赋值完后,j++后就是新的字符串的长度
第30题
4处填:( )
【答案】:s[i]
【解析】
基于新的字符串长度(不是之前的长度),输出所有字符
(最大子矩阵和)给出m行n列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。
输入第一行包含两个整数m和n,即矩阵的行数和列数。之后m行,每行n个整数,描述整个矩阵。程序最终输出最大的子矩阵和。
#include <iostream>
using namespace std;
const int SIZE=100;
int matrix[SIZE+1][SIZE+1];
int rowsum[SIZE+1][SIZE+1];
//rowsum[i][j]记录第i行前j个数的和
int m, n, i, j, first, last, area, ans;
int main() {
cin >> m >> n;
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
cin >> matrix[i][j];
ans = matrix__1__;
for (i=1; i<=m; i++)
__2__;
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
rowsum[i][j] = __3__;
for (first=1; first<=n; first++)
for (last=first; last<=n; last++) {
__4__;
for (i=1; i<=m; i++) {
area += __5__;
if (area>ans) ans = area;
if (area<0) area = 0;
}
}
cout << ans << endl;
return 0;
}
第31题
1处填:( )
【答案】:[1][1]
【解析】
使用matrix第1行第1列的值作为ans的最大值(初值,这里并没有使用-1e9作为最大值的初值)
第32题
2处填:( )
【答案】:rowsum[i][0] = 0
【解析】
为每一行的前缀和赋初值为0(感觉不赋值也行)
第33题
3处填:( )
【答案】:rowsum[i][j-1]+matrix[i][j]
【解析】
前缀和的计算公式
第34题
4处填:( )
【答案】:area = 0
【解析】
每一次计算子矩阵和,就需要初始化初值为0
第35题
5处填:( )
【答案】:rowsum[i][last] - rowsum[i][first-1]
【解析】
area需要依次增加每行每段(起始列~终止列)的前缀和

浙公网安备 33010602011771号