【csp-j】看完这一篇就够了

初赛形式说明

题目形式

·15个单项,算法理解,数学问题等

·3篇阅读程序,每篇4选2填

·2篇完善程序,5空

涉及内容

算法、离散数学、组合数学、阅读程序的能力

选择题涉及内容

计算机组成(较少)
软件、操作系统、计算机网络(较少)
进制转换(重点)
编码与数据表示
基础数据结构与算法(重点,难点)
数学问题(重点:排列组合)
计算机历史、NOI 系列问题

计算机基础

IT发展历史

第一台计算机埃尼阿克,1946年
应用:计算,数据储存处理,通信,辅助工作等第一个程序员:Ada(女),有为此命名的程序语言图灵奖(计算机)
菲尔兹奖(数学)、诺贝尔奖(物化生经济文学和平)ACM(美国计算机学会)、IEEE(电气与电子工程师协会)、CCF(dddd)

【2018提高,不定项】下列关于图灵奖的说法中,正确的有()。
A.图灵奖是由电气和电子工程师协会(IEEE)设立的。B.目前获得该奖项的华人学者只有姚期智教授一人。
C.其名称取自计算机科学的先驱、英国科学家艾伦·麦席森·图灵。
D.它是计算机界最负盛名、最崇高的一个奖项,有“计算机界的诺贝尔奖”之称。

解:BCD。ACM设立,华人姚期智,纪念图灵

计算机组成

【2018初赛】以下哪一种设备属于输出设备
A.扫描仪 B.键盘 C.鼠标 D.打印机

解析:D。将信息输入进计算机的是输入设备;将计算机的信息输出给人的是输出设备。触摸屏既是输入设备,也是输出设备

计算机组成

字长:32位和64位;

主频:2.4GHz;

内存:8GB

位Bit:一个01;字节Byte;

八个011KB=1024Byte;1MB=1024KB;1GB=1024MB;1TB=1024GB

摩尔定律:18个月翻倍

**【2019入门】**一个32位整型变量占用()个字节。

A.32B.128C.4D.8

解:C。32/8=4.

软件系统

操作系统:Windows、DOS、UNlX、Linux、.MacOS

Android、iOS、鸿蒙(华为)

应用软件(浏览器、办公软件、游戏…)

机器语言、汇编语言、高级语言

【2016普及】以下不是微软公司出品的软件是()

A.PowerpointB.WordC.ExcelD.Acrobat Reader

编码

文字、图片、声音等->01串

ASCII编码、GBK编码(2字节)、utf-8(3字节)

图片:黑白(01)、24位彩色(RGB)

文件系统扩展名:

图片:jpg,gif,png,tiff,jpeg

文档:txt,docx,pdf

声音:mp3/视频:avi,rm,mp4

可执行文件:exe(Windows),无(Linux)

【2019提高】下列属于图像文件格式的有()

A.WMVB.MPEGC.JPEGD.AVI

解:C。

NOI系列

NOI:1984,中国计算机学会(CCF)

NOIP:1995-2019(复活于2020年)

可以带:文具(稿纸不可),衣服,水,证件

2022年后只能用C++

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

A.1983B.1984C.1985D.1986

解:B。

程序设计

编译:代码->可执行文件(机器码)C/C++,Pascal

解释:一行一行运行Python,JavaScript,PHP,BASIC

https://www.zhihu.com/answer/830343420

时间复杂度:数据规模增长和运行时间增长的趋势

【2019提高】编译器的功能是()
A.将源程序重新组合
B.将一种语言(通常是高级语言)翻译成另一种语言(通常是低级语言)
C.将低级语言翻译成高级语言
D.将一种编程语言翻译成自然语言
解:B。

基础算法

排序

在这里插入图片描述在这里插入图片描述
【2018普及】以下排序算法中,不需要进行关键字比较操作的算法是()。
A.基数排序 B.冒泡排序 C.堆排序 D.直接插入排序

解:A。
归并排序 稳定 O(n log n) 需要额外辅助空间

快速排序 不稳定 O(n logn)最坏O(n2)
堆排序 不稳定 O(n log n)

【2019提高】排序的算法很多,若按排序的稳定性和不稳定性分类,则()是不稳定排序。
A. 冒泡排序
B.直接插入排序
C.快速排序
D.归并排序

解:C

贪心

在这里插入图片描述
【2019入门】新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。
方案一:每次连续跑3公里可以消耗300千卡(耗时半小时);方案二:每次连续跑5公里可以消耗600千卡(耗时1小时)。小胖每周周一到周四能抽出半小时跑步,周五到周日能抽出一小时跑步。另外,教练建议小胖每周最多跑21公里,否则会损伤膝盖。
请问如果小胖想严格执行教练的训练方案,并且不想损伤膝盖,每周最多通过跑步消耗多少千卡?()
A.3000/B.2500/C.2400/D.2520
解:C。优先周末跑5公里(性价比高)。然后非周末2天

二分

在这里插入图片描述
【2019入门】设有100个已排好序的数据元素,采用折半查找时,最大比较次数为()
A.7 B.10 C.6 D.8
解:A。log(64)=6。log(128)=7

递推递归分治

递推:从小到大顺推
斐波那契数列1123581321
f0)=f(1)=1,f0)=fi-1)+fi-2)
分治:大问题拆成小问题,递归解决
例如归并排序和快速排序

在这里插入图片描述
【2017提高,不定项】 对于入栈顺序为a,b,C,d,e,f,g的序
列,下列()不可能是合法的出栈序列。
A.a,b,c,d,e,f,g
B.a,d,c,b,e,g,f
C.a,d,b,c,g,f,e
D.g,f,e,d,c,b,a

解:C。经过模拟,d出栈是有压着c,b不可能比c先出。

队列

在这里插入图片描述

链表

在这里插入图片描述
【2019入门】 链表不具有的特点是()
A.插入删除不需要移动元素
B.不必事先估计存储空间
C.所需空间与线性表长度成正比
D.可随机访问任一元素
解:D。一个接着一个,没有连续的存储。

在这里插入图片描述
【2018提高,不定项】 下列说法中,是树的性质的有()。
A.无环
B.任意两个结点之间有且只有一条简单路径
C.有且只有一个简单环
D.边的数目恰是顶点数目减1
解:ABD

二叉树

高度,节点数量,叶子节点数量。下一层数量是上一层2倍。每层的数量2^(i-1),一共数量2^i-1
完美(满)二叉树、完全二叉树。完全二叉树的节点编号
在这里插入图片描述
【2019入门】 一棵二叉树如右图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i,则其左孩子位于下标2i处、右孩子位于下标2i+1处,则该数组的最大下标至少为()。
A.6 B.10 C.15 D.12
解:C。将其补齐为完美二叉树,一共有15个节点
在这里插入图片描述
【2019入门】 假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为()。
A.ABCDEFGHIJ
切 B.ABDEGHJCFI C.ABDEGJHCFI D.ABDEGHJFIC
解:B。后续遍历最后一个是根。然后在中序遍历中找到根,分为左右子树,然后继续递归。

表达式树

中序表达式
(a+(bc)+(de)
后缀表达式-后序遍历
前序表达式-前序遍历
在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0c9TNJw-1691568928540)(https://flowus.cn/preview/1e6c9dd6-6131-4a96-940a-735118d43344)]

【2018提高】 表达式a*d-b*c的前缀形式是()。
A.ad*bc*-
B.-*ad*bc’
C.a*d-b*c’
D.-**adbc’

解:B

【2019提高】 G是一个非连通无向图(没有重边和自环),共
有28条边,则该图至少有()个顶点。
A.10
B.9
C.11
D.8
解:2个点:1条边。3个点:1+2.4个点:1+2+3=6。
7个点:21条边。8个点:1+2+…+7=28条边。
但注意题目要求非联通。8个点不够

邻接矩阵

i\j1234
10523
25001
32004
43140

邻接表

1:[{③,2]
2:[{①,1},{④,6}]
3:[{④,5]
2:[{①,4},{②,3]

在这里插入图片描述
【2019提高】 以下哪个结构可以用来存储图()
A.栈
B.二叉树
C.队列
D.邻接矩阵
解:D,邻接矩阵或者邻接表(链表)
在这里插入图片描述

单源最短路径:Dijkstra算法O(n log n),SPFA死了
全部点对最短路径:Floyd?算法O(n3)
最小生成树:Prim O(n2)、Kruskal O(e log e)
欧拉回路:一笔画问题,只能最多2个奇数度的定点

【2019提高】 以下哪些算法不属于贪心算法?()
A.Dijkstra算法
B.Floyd算法
C.Prim算法
D.Kruskal算法
解:B。严格说是一种动态规划。

进制转换与位运算

初赛常见数学考点

进制转换

前缀、中缀、后缀表达式&表达式树

树和图的性质

复杂度分析

组合数学

进制转换

进制转换
首先考虑十进制:
1629 = 1 ∗ 1000 + 6 ∗ 100 + 2 ∗ 10 + 9 进一步地 1629 = 1 ∗ 1 0 3 + 6 ∗ 1 0 2 + 2 ∗ 1 0 1 + 9 ∗ 1 0 0 1629=1*1000+6*100+2*10+9 进一步地 1629=1*10^3+6*10^2+2*10^1+9*10^0 1629=11000+6100+210+9进一步地1629=1103+6102+2101+9100
于是我们给出进制的概念:
· 一个k进制的正数,是其每一位乘以k的对应次方之和。相当于给每一位赋予不同的权重。
· 各种进制只是对数的不同描述,运算规律在各种进制下不变。

技巧
其他进制转十进制:乘幂,再加法
十进制转其他进制:短除法

位运算

& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移,最右边补0

右移,标准没有规定最左边补什么!
实践上,unsigned直接补0;signed复制原先的最高位。

详见:进制

【NOIP 2018 提高组初赛】为了统计一个非负整数的二进制形式中 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

补码

补码是这样一套体系:
[0,231—1]这231个非负数,直接存储二进制。
[—231,—1]这231个负数,存储其相应正数的加法逆元。e.g.
7存储为000...00111—7存储为111...11001
加法逆元:x和inv(x)加在一起,变成0.
在这里插入图片描述
补码体系有这些好处:
易运算。计算a—b只需要计算a+(—b)
只有一个0.
非常容易获取一个数的相反数。
如何获取—x的补码?仅需(~x+1).

主定理(重点)

假设有递推关系式 T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n),其中 n 为问题规模, a 为递推的子问题数量,

n b \frac{n}{b} bn为每个子问题的规模(假设每个子问题的规模基本一样),

f ( n ) f(n) f(n)递推以外进行的计算工作。

a ≥ 1 a≥1 a1 b > 1 b>1 b>1为常数,f(n) 为函数,T(n) 为非负整数。则有以下结果(分类讨论):

(1)若
在这里插入图片描述
那么
在这里插入图片描述
(2)若
在这里插入图片描述
那么
在这里插入图片描述
(3)若
在这里插入图片描述
且对于某个常数 c < 1 c<1 c<1和所有充分大的 n 有 a f ( n b ) ≤ c f ( n ) af(\frac{n}{b}) \leq cf(n) af(bn)cf(n),那么 T ( n ) = θ ( f ( n ) ) T(n)=\theta(f(n)) T(n)=θ(f(n))

计数原理与排列组合

例题1 CSP 2020入门组第一轮[T1]
5个小朋友并排站成一列,其中有两个小朋友是双胞胎,如果要求这两个双胞胎必须相邻,则有( )种不同排列方法?

A.48 B.36 C.24 D.72

解:捆绑法,A

例题2 CSP 2020入门组第一轮[T2]
10个三好学生名额分配到7个班级,每个班级至少有一个名额,一共有( )种不同的分配方案。
A.84 B.72 C.56 D.504

解:插板法,A

例题3 CSP 2020 入门组第一轮[T3]
有五副不同颜色的手套(共10只手套,每副手套左右手各1只),一次性从中取6只手套,请问恰好能配成两副手套的不同取法有( )种。
A.120 B.180 C.150 D.30

解:A,C(5,2)*C(3,2)22=120

例 题4 CSP 2020 提高组第一 轮[T4]
从一个4×4的棋盘中选取不在同一行也不在同一列上的两个方格,共有( )种方法。
A.60 B. 72 C. 86 D. 64

解:B,(44)(3*3)/ 2

例题5 CSP 2019 入门组第一轮[T5]
把8个同样的球放在5个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的分法?( )
提示:如果8个球都放在一个袋子里,无论是哪个袋子,都只算同一种分法。
A.22 B.24 C.18 D.20

解:C,暴力列举

例题6 CSP 2019 入门组第一轮 [T6]
一副纸牌除掉大小王有52张牌,四种花色,每种花色13张。假设从这52张牌中随机抽取13张纸牌,则至少( )张牌的花色一致。
A.4
B.2
C.3
D.5

解:A,鸽巢问题

例题7 CSP 2019 提高组第一轮 [T7]
由数字1,1,2,4,8,8所组成的不同的4位数的个数是( )。
A.104
B.102
C.98
D.100

解:B,第一种情况:1248 4!=24,第二种情况:1124 1128 1148 1288 1488 2488 4!/2!=12,第三种情况:1188 4!/2!/2!=6,24+12*6+6=102

例题8 CSP 2019 提高组第一轮 [T8]
一次期末考试,某班有15人数学得满分,有12人语
文得满分,并且有4人语、数都是满分,那么这个
班至少有一门得满分的同学有多少人?( )。
A.23 B.21 C.20 D.22

解:A,15+12-4=23

2020 年 CSP-J 组第一轮真题讲解

第1题

在内存储器中每个存储单元都被赋予一个唯一的序号,称为(A)
A.地址
B.序号
C.下标
D.编号

解析
程序和数据平常存储在硬盘等存储器上,不管你开机或关机了
它们都是存在的,不会丢失。硬盘可以存储的东西很多,但其传
输数据的速度较慢。所以需要运行程序或打开数据时,这些数据
必须从硬盘等存储器上先传到另一种容量小但速度快得多的存储
器,之后才送入CPU进行执行处理。这中间的存储器就是内存。
无论何种存储器,软盘、硬盘、光盘或者内存,都有地址。因为
它们要存储数据,所以就必须按一定的单位的数据分配一个地址
有了地址,程序才能找到这些数据。这很好理解,想想你们家为
什么要有门牌号即可。
我们编程中的每一行代码,代码中用到的每个数据,都需要在内
存上有其映射地址。

迁移演练

(NO1P2018普及组初赛第1题)以下哪一种设备属于输出设备(D)
A.扫描仪
B.键盘
C.鼠标
D.打印机

解析:

输出设备(Output Device)是计算机硬件系统的终端设备
用于接收计算机数据的输出显示、打印、声音、控制外围设备操
作等。也是把各种计算结果数据或信息以数字、字符、图像、声
音等形式表现出来。常见的输出设备有显示器、打印机、绘图仪、
影像输出系统、语音输出系统、磁记录设备等。

迁移演练

(NOIP2016普及组初赛第4题)以下不是CPU生产厂商的是©。
A.Intel
B.AMD
C.Microsoft
D.IBM

解析:

摩尔定律是英特尔创始人之一戈登摩尔的经验之谈,其核
心内容为:集成电路上可以容纳的晶体管数目在大约每经过18个
月便会增加一倍。换言之,处理器的性能每隔两年翻一倍。

迁移演练

(NOIP2016普及组初赛第5题) 以下不是存储设备的是(D)。
A.光盘
B.磁盘
C.固态硬盘
D鼠标
**解析:**常见存储设备包括利用电能方式存储信息的设备如:各式
存储器,如RAM(Random Access Memory,随机存取存储器,高
速易失)、ROM(Read-Only Memory,.只读存储器,稳定)等;
利用磁能方式存储信息的设备如:硬盘、软盘、磁带、U盘;利用
光学方式存储信息的设备如:CD或DVD

迁移演练

(NOIP2015普及组初赛第2题) 在PC机中,PENTIUM(奔腾)、
酷睿、赛扬等是指©。
A.生产厂家名称
B.硬盘的型号
C.CPU的型号
D.显示器的型号
解析:

Intel奔腾、酷睿(Core)、赛扬(Cell)等
AMD锐龙(Ryzen).、速龙(Athlon)等

第2题

编译器的主要功能是(A)。
A.将源程序翻译成机器指令代码
B.将源程序重新组合
C.将低级语言翻译成高级语言
D.将一种高级语言翻译成另一种高级语言

解析
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另种语言(通常为低级语言)"的程序。一个现代编译器的主要工作流程:源代码(source code)→预处理器
(preprocessor)→编译器(compiler)→目标代码(object code)→链接器(Linker)→可执行程序(executables)高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target
language)机器代码的等价程序。源代码一般为高级语言(Highlevel language),如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称
作机器代码(Machine code)

迁移演练

(NOIP2017普及组初赛第6题) 下列不属于面向对象程序设计语言的是(A)。
A.C
B.C++
C.Java
D.C#
**解析:**一代机器语言,二代汇编语言,三代高级语言。从描述客
观系统来看,程序设计语言可以分为面向过程语言(以“数据结构
+算法"程序设计范式构成的程序设计语言,C/Fortran)和面向对
象语言(以“对象+消息”程序设计范式构成的程序设计语言,VB)

迁移演练

(NOIP2015普及组初赛第3题) 操作系统的作用是©。
A.把源程序译成目标程序
B.便于进行数据管理
C.控制和管理系统资源
D.实现硬件之间的连接
**解析:**操作系统(operating system,简称OS)是管理计算机硬件
与软件资源的计算机程序。操作系统需要处理如管理与配置内存、
决定系统资源供需的优先次序、控制输入设备与输出设备、操作
网络与管理文件系统等基本事务。操作系统也提供一个让用户与
系统交互的操作界面。

第3题

x=true,y=true,z=false,以下逻辑运算表达式值为真的是(D)。

A.(y∨z)∧x∧z

B.x∧(z∨y) ∧z

C.(x∧y) ∧z

D.(x∧y)∨(z∨x)

解析
已知x=true,y=true,Z=false,则
A.(yVz)AxAz =(true Vfalse)Atrue A false true A true A false
false
B.xA(zVy)Az trueA(false Vtrue)Afalse true Atrue A false
false
C.(
(xAy)Az=(true Atrue)Afalse’=true A falsefalse
D.(xAy)V(z Vx)=(true Atrue)V(false Vtrue)=true Vtrue
true

迁移演练

(CSP2019入门组第一轮第2题) 二进制数11101110010111和
01011011101011进行逻辑与运算的结果是(D)。
A.01001010001011
B.01001010010011
C.01001010000001
D.01001010000011
**解析:**对于每一位都有0&0=0&1=1&0=0和1&1=1

迁移演练

(NOIP 2016 普及组初赛试题第 17 题) 下图表示一个果园灌溉系统,有 A , B , C , D A,B,C,D A,B,C,D 四个阀门,每个阀门可以打开或关上,所有管道粗细相同,以下设置阀门的方法中,可以让果树浇上水的是(A)。

在这里插入图片描述
A.B 打开,其他都关上

B.AB 都打开,CD 都关上

C.A 打开,其他都关上

D.D 打开,其他都关上

第 4 题

现有一张分辨率为 2048×1024 像素的 32 位真彩色图像。请问要存储这张图像,需要多大的存储空间?©。

A.16MB

B.4MB

C.8MB

D.2MB

解析
2048×1024=2,097,152像素
2,097,152×32=67,108,864位(bits)
67,108,864÷8=8,388,608字节(Bytes)
8,388,608÷1,024=8,192千字节(Kilobytes)
8,192÷1,024=8兆字节(Megabytes)

迁移演练

(NOIP2017普及组初赛第2题) 计算机存储数据的基本单位是(B)。
A.Bit
B.Byte
C.GB
D.KB
解析: 需要注意bit虽然是最小单位,但不是基本单位。

迁移演练

(NOIP2017普及组初赛第4题) 分辨率为800x600、16位色的
位图,存储图像信息所需的空间为()。
A.937.5KB
B.4218.75KB
C.4320KB
D.2880KB
正确答案:A
解析: 80060016(bits)/8(bits per byte)/1024(bytes perkilobyte)=937.5 kilobytes

迁移演练

(NOIP2016普及组初赛第2题) 如果256种颜色用二进制编码来
表示,至少需要()位。
A.6
B.7
C.8
D.9
正确答案:C
解析: log ⁡ 10 256 = 8 \log_{10}256=8 log10256=8

第 5 题

冒泡排序算法的伪代码如下:

输入:数组L, n ≥ k。输出:按非递减顺序排序的 L。
算法 BubbleSort:
   1. FLAG ← n //标记被交换的最后元素位置
   2. while FLAG > 1 do
   3.     k ← FLAG -1
   4.     FLAG ← 1
   5.     for j=1 to k do
   6.         if L(j) > L(j+1) then do
   7.              L(j)  ↔ L(j+1)
   8.              FLAG ← j

对 n 个数用以上冒泡排序算法进行排序,最少需要比较多少次?( )。

A. n 2 n^2 n2

B. n − 2 n−2 n2

C. n − 1 n−1 n1

D. n n n

解析
时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关
键字比较次数 C C C和记录移动次数M均达到最小值: C m i n = n − 1 , M m i n = 0 C_{min}=n-1, M_{min}=0 Cmin=n1,Mmin=0
所以,冒泡排序最好的时间复杂度为 O ( n ) O(n) O(n)
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行 n − ⅰ n-ⅰ n次关键字的比较 ( 1 ≤ ⅰ ≤ n − 1 ) (1≤ⅰ≤n-1) (1n1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,

比较和移动次数均达到最大值:

c m a x = n ( n − 1 ) 2 = O ( 2 ) c_{max}=\frac{n(n-1)}{2}=O(2) cmax=2n(n1)=O(2)s

M m a x = 3 n ( n − 1 ) 2 = O ( 2 ) M_{max}=\frac{3n(n-1)}{2}=O(2) Mmax=23n(n1)=O(2)

冒泡排序的最坏时间复杂度为 O ( 2 ) O(2) O(2):
综上,因此冒泡排序总的平均时间复杂度为 O ( n ) O(n) O(n)

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

在这里插入图片描述

迁移演练

(CSP2019入门组第一轮第5题) 设有100个已排好序的数据元
素,采用折半查找时,最大比较次数为(A)
A.7
B.10
C.6
D.8

解析: l o g 2 100 = 7 log_{2}100=7 log2100=7

迁移演练

(NOIP2018普及组初赛第8题) 以下排序算法中,不需要进行
关键字比较操作的算法是(A)
A.基数排序
B.冒泡排序
C.堆排序
D.直接插入排序
解析: 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

迁移演练

(NOIP2018普及组初赛第9题) 给定一个含N个不相同数字的
数组,在最坏情况下,找出其中最大或最小的数,至少需要N-1
次比较操作。则最坏情况下,在该数组中同时找最大与最小的数
至少需要()次比较操作。(⌈⌉表示向上取整,⌊⌋表示向下取整)
A.⌈3N/2⌉-2
B.⌊3N/2⌋-2
C.2N-2
D.2N-4

解析
在N个不相同数字的数组同时查找最大值与最小值的算法思想如下:对N个数字两两比较,再将较大的数字与最大值打擂合,较小的数字与最小值打擂合。
最坏情况下的算法时间复杂度:
当N是奇数时,[N/2]×3。将第一个数赋值给最大值和最小值。
然后将剩下N-1个整数两两一组,共(N-1)/2组,每组组内比较一次,与最大值比较一次,与最小值比较一次,共三次。总比较次数:3×(N-1)/2。
当N是偶数时,将前两个数比较一次,将较大数赋值给最大值
较小数赋值给最小值。然后将剩下的N一2个数两两一组,共(N-2)/2组,每组组内比较一次,与最大值比较一次,与最小值比较一次,共三次。总比较次数3×(N-2)/2+1。

迁移演练

(NOIP2017普及组初赛第17题) 设A和B是两个长为n的有序数组,现在需要将A和B合并成一个排好序的数组,任何以元素比较作为基本运算的归并算法在最坏情况下至少要做(D)次比较。
A. n 2 n2 n2
B. n l o g n n log n nlogn
C. 2 n 2n 2n
D. 2 n − 1 2n-1 2n1

解析: 将A与B中的元素两两比较,将值小的放进C,直到C填满为止。因为C有2n个空位,每次两两比较就放进去一个数,而最后一个剩下的元素可以不用比较直接放进去,所以一共两两比较了 2 n − 1 2n-1 2n1次。

迁移演练

(NOIP2015普及组初赛第19题) 某算法的计算时间表示为递推
关系式T(n)=T(n-1)+n(n为正整数)及T(0)=1,则该算法的时间复
杂度为(D)
A. O ( l o g n ) O(logn) O(logn)
B. O ( n l o g n ) O(nlogn) O(nlogn)
C. O ( n ) O(n) O(n)
D. O ( n 2 ) O(n^2) O(n2)

解析: ∑ i = 1 n i = n ( n + 1 ) 2 \sum_{i=1}^n i=\frac{n(n+1)}{2} i=1ni=2n(n+1)

第6题

设A是介个实数的数组,考虑下面的递归算法:

XYZ (A[1..n])
if n=1 then return A[1]
else temp XYZ (A[1..n-1])
if temp A[n]
then return temp
else return A[n]

请问算法XYZ的输出是什么?(B)。
A.A数组的平均
B.A数组的最小值
C.A数组的中值
D.A数组的最大值
解析: 每次递归均返回前n-1个数值的答案与第n个数中的较小
者,容易发现所求即为A数组的最小值。

迁移演练

若有如下程序段,其中 sabc 均已定义为整型变量,且 ac 均已赋值(c 大于 0)

s = a;  
for (b = 1; b <= c; b++) s = s - 1;  

则与上述程序段功能等价的赋值语句是(A)

A.s = a - c;

B.s = a - b;

C.s = s - c;

D.s = b - c;

**解析:**s的值在a的基础上减去了c次1,即s的值变为a-c。

迁移演练

(NOIP2018普及组初赛第10题) 下面的故事与(B)算法有着月曲同工之妙。

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:
“从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:
“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事”
A.枚举
B.递归
C.贪心
D.分治

迁移演练

(NOIP2018普及组初赛第14题) 为了统计一个非负整数的二进
制形式中1的个数,代码如下:

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

则空格内要填入的语句是(B)。
A.X>>=1
B.X&=X-1
C.x=×>>1
D.X<<=1

解析
此题考察对lowbit函数的理解与应用。
如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把
最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把
一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

迁移演练

给定含有 n 个不同的数的数组 L=<x1​,x2​,…,xn​>。如果 L 中存在 xi​ (1<i<n) 使得 x1​<x2​<⋯<xi−1​<xi​>xi+1​>⋯>xn​ , 则称 L 是单峰的,并称 xi​ 是 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)。
A.c,a,b
B.c,b,a
C.a,b,c
D.b,a,c

第7题

(CSP2019入门组第一轮第6题、NOIP2015普及组初赛第13题)

链表不具有的特点是(A)。
A.可随机访问任一元素
B.不必事先估计存储空间
C.插入删除不需要移动元素
D.所需空间与线性表长度成正比
解析
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找个节点或者访问特定编号的节点则需要O()的时间,而线性表和顺序表相应的时间复杂度分别是O(log)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向 链表以及循环链表。

迁移演练

(NOIP2017普及组初赛第13题) 向一个栈顶指针为hs的链式
栈中插入一个指针S指向的结点时,应执行(B)。
A.hs->next s;
B.s->next hs;hs s;
C.s->next hs->next;hs->next =s;
D.s->next hs;hs hs->next;
解析: 往栈中插入数据,栈是向下生长的,由高地址到低地址
所以s节点就是在低地址处,hs指向原栈顶,插入s后,s是新的栈
顶,s的地址比原栈顶hs地址低,所以是s->next=hs,最后hs=s更新
栈顶指针指向

迁移演练

(NOIP2015普及组初赛第14题) 线性表若采用链表存储结构,
要求内存中可用存储单元地址(D)。
A.必须连续
B.部分地址必须连续
C.一定不连续
D.连续不连续均可

第8题

有10个顶点的无向图至少应该有(A)条边才能确保是一个连通图
A.9
B.10
C.11
D.12
解析: 有n个顶点的无向图至少应该有(n一1)条边才能确保是
个连通图,当恰好有(n-1)条边时所得的连通图称为树。

迁移演练

(NOIP2018普及组初赛第11题) 由四个没有区别的点构成的简
单无向连通图的个数是(A)。
A.6
B.7
C.8
D.9
解析: 简单图指没有平行边和自环。

在这里插入图片描述

迁移演练

(NOIP2017普及组初赛第10题) 设G是有n个结点、m条边
(n≤m)的连通图,必须删去G的()条边,才能使得G变成
一棵树。
A.m-n+1
B.m-n
C.m +n +1
D.n-m +1

解析: m-(n-1)=m-n+1

迁移演练

(NOIP2016普及组初赛第15题) 设简单无向图G有16条边且
每个顶点的度数都是2,则图G有(D)个顶点。
A.10
B.12
C.8
D.16

解析: 每个顶点度数都是2意味着图G恰好成环,顶点数即边数。

迁移演练

(NOIP2015普及组初赛第12题) 6个顶点的连通图的最小生成
树,其边数为(B)。
A.6
B.5
C.7
D.4
解析: 最小生成树的边数比顶点数少1。

第9题

二进制数1011转换成十进制数是(A)。
A.11
B.10
C.13
D.12

解析: ( 1011 ) 2 = 2 0 + 2 1 + 2 3 = 2 + 3 + 8 = ( 11 ) 10 (1011)_{2}=2^0+2^1+2^3=2+3+8=(11)_{10} (1011)2=20+21+23=2+3+8=(11)10

迁移演练

(NOIP2018普及组初赛第2题) 下列四个不同进制的数中,与
其它三项数值上不相等的是(D)

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

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

C. ( 1151 ) 8 (1151)_{8} (1151)8

D. ( 1001101011 ) 2 (1001101011)_{2} (1001101011)2

解析: ( 1001101011 ) 2 = ( 619 ) 10 (1001101011)_{2}=(619)_{10} (1001101011)2=(619)10

迁移演练

(NOIP2017普及组初赛第1题) 在8位二进制补码中,10101011表示的数是十进制下的(B)。
A.43
B.-85
C.-43
D.-84

解析

· 原码求补码
正整数的补码是其二进制表示,与原码相同求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。同一个数字在不同的补码表示形式中是不同的。比如-15的补码在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
例:求-5的补码。
5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加00000001为(11111011)所以-5的补码是11111011。
· 补码求原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码
(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个
补码的补码就是要求的原码。
例:已知一个补码为11111001,则原码是00000111(7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;再加1,所以是10000111。

迁移演练
(NOIP2017普及组初赛第15题)十进制小数13.375对应的二进制数是(A)
A.1101.011
B.1011.011
C1101.101
D.1010.01

解析: ( 0.375 ) 10 = 0.25 + 0.125 = 2 − 2 + 2 − 3 (0.375)_{10}=0.25+0.125=2^{-2}+2^{-3} (0.375)10=0.25+0.125=22+23

迁移演练

(NOIP2016普及组初赛第7题) 二进制数00101100和00010101的和(B)。
A.00101000
B.01000001
C.01000100
D.00111000

迁移演练

(NOIP2016普及组初赛第8题) 与二进制小数0.1相等的八进制数是(B)
A.0.8
B.0.4
C.0.2
D.0.1

解析: ( 0.1 ) 2 = ( 0.5 ) 10 = ( 0.4 ) 8 (0.1)_{2}=(0.5)_{10}=(0.4)_{8} (0.1)2=(0.5)10=(0.4)8

迁移演练

(NOIP2015普及组初赛第4题) 在计算机内部用来传送、存贮、
加工处理的数据或指令都是以(A)形式进行的。
A.二进制码
B.八进制码
C.十进制码
D.智能拼音码

第10题

5个小朋友并排站成一列,其中有两个小朋友是双胞胎,如果要求
这两个双胞胎必须相邻,则有(A)种不同排列方法?
A.48
B.36
C.24
D.72
**解析:**在做排列的题目时,解决某些元素相邻(要求在一起)问题常
用捆绑法:把相邻元素看作一个整体,再与其他元素一起排列,
同时注意捆绑元素的内部排列。此题中有 A 4 4 A 2 2 = 24 ∗ 2 = 48 A_4^4A_2^2=24*2=48 A44A22=242=48

迁移演练

(CSP2019入门组第一轮第7题) 把8个同样的球放在5个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的分法?(C)
提示:如果8个球都放在一个袋子里,无论是哪个袋子,都只算同一种分法。
A.22
B.24
C.18
D.20

解析:

法1:

不妨考虑按袋子数目进行分类讨论。
当放在一个袋子里时:8=8
当放在两个袋子里时:8=1+7,8=2+6,8=3+5,8=4+4
当放在三个袋子里时:8=1+1+6,8=1+2+5,8=1+3+4,8=2+2+4,8=2+3+3
当放在四个袋子里时:8=1+1+1+5,8=1+1+2+4,8=1+1+3+3,8=1+2+2+3,8=2+2+2+2
当放在五个袋子里时:8=1+1+1+1+4,8=1+1+1+2+3,8=1+1+2+2+2
故总的方案数为1+4+5+5+3=18种。

法2:

设有 n n n个球, m m m个盒子。
在这里插入图片描述

迁移演练

(CSP2019入门组第一轮第12题) 一副纸牌除掉大小王有52张牌,四种花色,每种花色13张。假设从这52张牌中随机抽取13张纸牌,则至少(A)张牌的花色一致。
A.4
B.2
C.3
D.5

解析: 根据抽屉原理,把 m ( m > n ) m(m>n) m(m>n)个物体任意放入 n n n个抽屉里若 m = k n + r m=kn+r m=kn+r,则当 r > 0 r>0 r>0时其中一定有某个抽屉至少放 k + 1 k+1 k+1个物体。此题中有 ⌈ 13 / 4 ⌉ = 4 ⌈13/4⌉=4 13/4=4

第 11 题

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

在这里插入图片描述
A.栈
B.队列
C.二叉树
D.哈希表

解析
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素,从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉使其相邻的元素成为新的栈顶元素。
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

迁移演练

(NOIP2017普及组初赛第16题) 对于入栈顺序为a,b,c,d,e,g的序列,下列©不可能是合法的出栈序列。
A.a,b,c,d,e,f,g
B.a,d,c,b,e,g,f
C.a,d,b,c,g,f,e
D.g,f,e,d,c,b,a

解析: a->空(a出栈)->b->bc->bcd->bc(d出栈),此时b位于栈顶的c下方,不可能先出栈。

迁移演练

(NOIP2015普及组初赛第15题) 今有一空栈S,对下列待进栈的数据元素序列a,b,c,d,e,f依次进行进栈,进栈,出栈进栈,进栈,出栈的操作,则此操作完成后,栈S的栈顶元素为(B)
A.f
B.c
C.A
D.b
解析: a->ab->a->ac->acd->ac

第12题

(NOIP2015普及组初赛第17题) 独根树的高度为1。具有61个结点的完全二叉树的高度为(D)
A.7
B.8
C.5
D.6

解析: 根据美国国家标准技术研究所(NIST)的定义,完全二叉树(Complete Binary Tree):除最后一层外的每层结点都完全填满在最后一层上如果不是满的,则只缺少右边的若干结点。
此题中有$\lceil log_261\rceil=6 $

迁移演练

(CSP2019入门组第一轮第14题) 假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为(B)。
A.ABCDEFGHIJ
B.ABDEGHJCF
C.ABDEGJHCFI
D.ABDEGHJFIC

解析
整体思路是这样的,由后序遍历找到每个节点,然后由中序遍历判断左右子树,将整个二叉树还原后写出前序遍历。后序遍历的顺序知道,最后一个A是二叉树的根节点,然后把中序遍历从A分成两段,A左边的是左子树,A右边的是右子树,
结果如下

在这里插入图片描述

然后看右边的子树,从后序遍历知道,左子树的后序遍历为FC,中序遍历为CF问题回到刚开始,重复之前的过程,由后序遍历知道根节点为C,把中序遍历从C分成两段,左边是左子树,右边是右子树也就是右边只有一个右子树,

在这里插入图片描述
然后再次重复以上过程,现在IF的后序遍历是IF,中序遍历是IF,说明
节点时F,I是F的左子树
在这里插入图片描述
这样,这棵二叉树的右子树就完全复原了,左子树的方法完全相同,就是一个递归过程,流程图如下
在这里插入图片描述
NEXT

在这里插入图片描述

迁移演练

(NOIP2015普及组初赛第16题) 前序遍历序列与中序遍历序
相同的二叉树为(D)。
A.根结点无左子树
B.根结点无右子树
C.只有根结点的二叉树或非叶子结点只有左子树的二叉树
D.只有根结点的二叉树或非叶子结点只有右子树的二叉树

解析: “根左右”与“左根右”所得相同,容易发现左子树应为空。

迁移演练
(NO1P2017普及组初赛第8题)2017年10月1日是星期日,
1999年10月1日是©。
A.星期三
B.星期日
C.星期五
D.星期二

解析: 2000是闰年,2004,2008,2012,2016年应该者是闰年共5个,即5个366天,13个非闰年,共13365+5366=4745+1830=6575天,6575%7=939余2,因1999年是向前找,所以是星期五

第14题
10个三好学生名额分配到7个班级,每个班级至少有一个名额
一共有(A)种不同的分配方案。
A.84
B.72
C.56
D.504
解析: 插板法,10个名额可以插入9个,7个班级插入6个板子即 C 9 6 = 84 C_9^6=84 C96=84

第15题
有五副不同颜色的手套(共10只手套,每副手套左右手各1只)一次性从中取6只手套,请问恰好能配成两副手套的不同取法有(A)种。
A.120
B.180
C.150
D.30

解析

从5副不同颜色的手套取6只手套,恰好能配成2副手套,可以分3步解决:
从5副手套中挑出2副手套,方案数有: C 5 2 = 10 C_5^2=10 C52=10
从剩下的3副手套中挑出2副手套(剩下的2只手套不同,所以
需要从2副手套中选出),方案数有: C 3 2 = 3 C_3^2=3 C32=3
由于颜色不同,这2只手套一共有4种组合:左左、左右、右左、
右右。利用乘法原理,一共有120种方案。

迁移演练

(NOIP2017普及组初赛第14题)若串S=“copyright",其子串的个数是©。
A.72
B.45
C.46
D.36

解析: 1 + ∑ i = 1 n i = n ( n + 1 ) 2 + 1 1+\sum_{i=1}^{n} i=\frac{n(n+1)}{2}+1 1+i=1ni=2n(n+1)+1

第 16 题

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

#include <cstdlib>
#include <iostream>
using namespace std;

char encoder[26] = {'C','S','P',0};
char decoder[26];

string st;

int main()  {
  int k = 0;
  for (int i = 0; i < 26; ++i)
    if (encoder[i] != 0) ++k;
  for (char x ='A'; x <= 'Z'; ++x) {
    bool flag = true;
    for (int i = 0; i < 26; ++i)
      if (encoder[i] ==x) {
        flag = false;
        break;
      }
      if (flag) {
        encoder[k]= x;
        ++k;
      }
  }
  for (int i = 0; i < 26; ++i)
     decoder[encoder[i]- 'A'] = i + 'A';
  cin >> st;
  for (int i = 0; i < st.length( ); ++i)
    st[i] = decoder[st[i] -'A'];
  cout << st;
  return 0;
}

•判断题

  1. 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。(A)

  2. 若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。(B)

  3. 将第 12 行的 i < 26 改为 i < 16,程序运行结果不会改变。(A)

  4. 将第 26 行的 i < 26 改为 i < 16,程序运行结果不会改变。(B )

•单选题

5) 若输出的字符串为 ABCABCABCA,则下列说法正确的是(A)。

6)若输出的字符串为 CSPCSPCSPCSP,则下列说法正确的是(D)。
1.
A.正确
B.错误
2.
A.正确
B.错误
3.
A.正确
B.错误
4.
A.正确
B.错误
5.
A.输入的字符串中既有 S 又有 P
B.输入的字符串中既有 S 又有 B
C.输入的字符串中既有 A 又有 P
D.输入的字符串中既有 A 又有 B
6.
A.输入的字符串中既有 P 又有 K
B.输入的字符串中既有 J 又有 R
C.输入的字符串中既有 J 又有 K
D.输入的字符串中既有 P 又有 R

解析:

本题主要实现字符串加密,代码中的两个字符数组encoder与decoder分别对应编码与解码。主要功能是用字符’C’、‘S’、‘P’替换字母表中的’A’、‘B’、‘C’,其余的字符向后移动。如表所示,encoder列即为加密状态;根据decoder[encoder[i]-A]=i+‘A’的规则解密为decoder状态。当输入的字符串st经过加密,从decoder相应得到解密后的st字符串。反之从decoder的字母,也能比照出cin的字母。
在这里插入图片描述
判断1:如果字符对应的ASCI码比大写字母A小(即减去‘A’)则下标可能会出现负值,最终导致越界,所以下标应限制在大写字母范围内,故本描述正确。
判断2:参照表,加密与解密序列中大写字母T之后的字母完全一致,即输入“UVWXYZ"输出也是“UVWXYZ",故本描述有误。
判断3:初始状态加密只对应3个有效字母,条件只需满足ⅰ不大于3即可,最终结果不受影响,故本描述正确。
判断4:遍历(循环)范围需包含所有的大写字母,故本描述有误。

第 17 题

#include <iostream>
using namespace std;

long long n, ans;
int k, len;
long long d[1000000];

int main() {
  cin >> n >> k;
  d[0] = 0;
  len= 1;
  ans = 0;
  for (long long i = 0; i <n; ++i) {
    ++d[0];
    for (int j = 0; j + 1<len; ++j) {
      if (d[j] == k) {
        d[j] = 0;
        d[j + 1] += 1;
        ++ans;
      }
    }
    if (d[len- 1] == k) {
      d[len - 1] = 0;
      d[len] =1;
      ++len;
      ++ans;
    }
  }
  cout << ans << endl;
  return 0;
}

假设输入的 n 是不超过 2 62 2^{62} 262 的正整数,k 都是不超过 10000 的正整数,完成下面的判断题和单选题:

  • 判断题
  1. 若 k=1,则输出 ans 时,len=n。(B)

  2. 若 k>1,则输出 ans 时,len —定小于 n。(B)

  3. 若 k>1,则输出 ans 时, k l e n k^{len} klen —定大于 n。(A)

  • 单选题
  1. 若输入的 n 等于: 1 0 15 10^{15} 1015,输入的 k 为 1,则输出等于(D)。

  2. 若输入的 n 等于 205,891,132,094,649(即 330),输入的 k 为 3,则输出等于(B)。

  3. 若输入的 n 等于 100,010,002,000,090,输入的 k 为 10,则输出等于( )。

1.
A.正确
B.错误
2.
A.正确
B.错误
3.
A.正确
B.错误
4.
A.1
B. ( 1 0 30 − 1 0 15 ) / 2 (10^{30}−10^{15})/2 (10301015)/2
C. ( 1 0 30 + 1 0 15 ) / 2 (10^{30}+10^{15})/2 (1030+1015)/2
D. 1 0 15 10^{15} 1015
解析: 输入数为1的情况,每个ⅰ会发生一次进位,共循环n次,因此共产生n次进位。
5.
A. 3 30 3^{30} 330
B. ( 3 30 − 1 ) / 2 (3^{30}−1)/2 (3301)/2
C. 3 30 − 1 3^{30}−1 3301
D. ( 3 30 + 1 ) / 2 (3^{30}+1)/2 (330+1)/2
在这里插入图片描述
6.
A.11,112,222,444,543
B.11,122,222,444,453
C.11,122,222,444,543
D.11,112,222,444,453

解析 利用26题得到的结论,那么当k=10时:累加到100,000,000,000,000,需要进位11,111,111,111,111次累加到10,000,000,000,需要进位1,111,111,111,111次累加到2,000,000,需要进位2×111,111=222,222次累加到90,需要进位9×1=9次总的进位次数ans=11,111,111,111,111+1,111,111,111,111+222,222+9=11,112,222,444,453

解析

本题是进制转换问题,模拟k进制的第个数。即询问将某数字进行进制转换后的进位计数。代码中len表示当前进位数,ans计数器记录发生了几次进位。
判断1:应该为第2位,即len为2,故本描述有误。
判断2:题意为判断k进制的位数是否一定小于n,以2为例,2的二进制是10,它的位数是2,Ien(2位)并不小于n,故本题不正确。
判断3:一个k进制数,如果有Ien位,每一位有k种变化,共能表示ken种数值,数值是从0到kn-1的,故本描述正确。

第 18 题

#include <algorithm>
#include <iostream>
using namespace std;                     
                                         
int n;                                   
int d[50][2];                            
int ans;                                 
                                        
void dfs(int n, int sum) {               
  if (n == 1) {                            
    ans = max(sum, ans);           
    return;                                   
  }                                        
  for (int i = 1; i < n; ++i) {            
    int a = d[i - 1][0], b = d[i - 1][1];  
    int x = d[i][0], y = d[i][1];            
    d[i - 1][0] = a + x;                     
    d[i - 1][1] = b + y;                     
    for (int j = i; j < n - 1; ++j)            
      d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
    int s = a + x + abs(b - y);              
    dfs(n - 1, sum + s);                    
    for (int j = n - 1; j > i; --j)          
      d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
    d[i - 1][0] = a, d[i - 1][1] = b;        
    d[i][0] = x, d[i][1] = y;                
  }                                        
}                                        
                                       
int main() {                             
  cin >> n;                                
  for (int i = 0; i < n; ++i)              
  cin >> d[i][0];
  for (int i = 0; i < n;++i)
     cin >> d[i][1];
  ans = 0;
  dfs(n, 0);
  cout << ans << endl;
  return 0;
}

假设输入的 n 是不超过 50 的正整数,d[i][0]d[i][1] 都是不超过 10000 的正整数,完成下面的判断题和单选题:

  • 判断题

    1. 若输入 n 为 0,此程序可能会死循环或发生运行错误。(B)

    2. 若输入 n 为 20,接下来的输入全为 0,则输出为 0。(A)

    3. 输出的数一定不小于输入的 d[i][0]d[i][1] 的任意一个。(B)

  • 单选题

    1. 若输入的 n 为 20,接下来的输入是 20 个 9 和 20 个 0,则输出为(B)。

    2. 若输入的 n 为 30,接下来的输入是 30 个 0 和 30 个 5,则输出为(C)。

    3. (4 分)若输入的 n 为 15,接下来的输入是 15 到 1,以及 15 到 1,则输出为(C)。

A.正确
B.错误

A.正确
B.错误
3.
A.正确
B.错误
4.
A.1890
B.1881
C.1908
D.1917
5.
A.2000
B.2010
C.2030
D.2020
6.
A.2440
B.2220
C.2240
D.2420
解析

判断1:当n为0时,dfs中for循环不会被执行,因此输出0,不会发生死循环。
判断2:当两个序列同时为0,dfs中sum也始终为0,则输出为0。
判断3:举出一个反例即可,例如n=1时,ans=0,小于d[1][0]和d[1][1]。

选择1:若B序列为0,那么dfs就是对A序列进行迭代求和。近似贪心思想,每次让刚合并过的行继续合并会得到更大的sum,即(9+9)+(9+9+9)+(9+9+9+9)+,因此 a n s = ( 2 + 20 ) × 19 2 × 9 ans=\frac{(2+20)×19}{2}\times9 ans=2(2+20)×19×9

选择2:若A序列为0,那么dfs就是对B序列相邻项差的绝对值迭代求和。带入n较小的情况可以发现规律,如n=4时加到25,可以推出n=30时加到285,即0+5+10+…+285=(2829)/2=2030

选择3:

在这里插入图片描述

第 19 题

三、完善程序(单选题,每小题 3 分,共计 30 分)

1.(质因数分解)给出正整数 n,请输出将 n 质因数分解的结果,结果从小到大输出。

例如:输入 n=120,程序应该输出 2 2 2 3 5,表示:120=2×2×2×3×5。输入保证 2≤n≤109。

提示:先从小到大枚举变量 i,然后用 i 不停试除 n 来寻找所有的质因子。

试补全程序。

#include <cstdio>
using namespace std;
int n, i;

int main() {
  scanf("%d", &n);
  for(i = ①; ② <=n; i ++){
    ③{
      printf("%d ", i);
      n = n / i;
    }
  }
  if(④)
    printf("%d ", ⑤);
  return 0;
}

1)①处应填(C)

2)②处应填(C)

3)③处应填(C)

4)④处应填(A)

5)⑤处应填(C)
1.
A.1

B.n-1

D.0

C.2
2.
A.n/i

B.n/(i*i)

C.i*i

D.i*i*i

解析: 质因子范围访问至 n \sqrt{n} n 即可,无需完整遍历。

A.if(n%i==0)

B.if(i*i<=n)

C.while(n%i==0)

D.while(i*i<=n)

解析: 对因子相同的情况,不断迭代直到不能被整除为止。

A.n>1

B.n<=1

C.i<n/i

D.i+i<=n

解析: 如果 n > 1 n>1 n>1,就表示因子未被完全除尽,即说明n中包含一个不小于 n \sqrt{n} n 的质因子。

A.2

B.n/i

C.n

D.i

解析: 因为其它小于等于 n \sqrt{n} n 的质因子已从n中除掉,最后还剩下n未输出,所以输出n。

第 20 题

(最小区间覆盖)给出 n 个区间,第 i 个区间的左右端点是 [ai​,bi​]。现在要在这些区间中选出若干个,使得区间 [0,m] 被所选区间的并覆盖(即每一个 0≤i≤m 都在某个所选的区间中)。保证答案存在,求所选区间个数的最小值。

输入第一行包含两个整数 n 和 m (1≤n≤5000,1≤m≤109)

接下来 n 行,每行两个整数 ai​,bi​ (0≤ai​,bi​≤m)。

提示:使用贪心法解决这个问题。先用 O(n2) 的时间复杂度排序,然后贪心选择这些区间。

试补全程序。

2)②处应填( )

   #include <iostream>

   using namespace std;

   const int MAXN = 5000;
   int n, m;
   struct segment { int a, b; } A[MAXN];

   void sort() // 排序
   {
     for (int i = 0; i < n; i++)
     for (int j = 1; j < n; j++)
     if (①)
         {
           segment t = A[j];
           ②
         }
   }

   int main()
   {
     cin >> n >> m;
     for (int i = 0; i < n; i++)
       cin >> A[i].a >> A[i]・b;
     sort();
     int p = 1;
     for (int i = 1; i < n; i++)
       if (③)
         A[p++] = A[i];
     n = p;
     int ans =0, r = 0;
     int q = 0;
     while (r < m)
     {
       while (④)
         q++;
       ⑤;
       ans++;
     }
     cout << ans << endl;
     return 0;
   }

1)①处应填(B)

解析: 对区间内的第一个元素进行冒泡排序,依据题意进行升序排序,如果右边的起点小于左边的起点则交换。

2)②处应填(D)

解析: 交换顺序,通过第三方变量中继传递,即将A]传递给然后将A如-1]赋值给A],最后t的值再传递给A如-1]。

3)③处应填(A)

解析: 去掉被包含的区间,只有当第个和第p-1个区间不是包含关系时,将第i个区间放入第p个位置

4)④处应填(A)

解析: 变量q从0开始,当q+1小于n时,才能确保第q+1个区间有值,同时只有在q+1个区间的第一个数小等于r时,这个区间才起用。

5)⑤处应填(B)

解析: 当前存储的最右边的区间和第9个区间的第二个元素取最大值,即用区间q的右端点更新r。

A.A[j].b>A[j-1].b

B.A[j].a<A[j-1].a

C. A[j].a>A[j-1].a

D.A[j].b<A[j-1].b

A.

A[j+1]=A[j];A[j]=t;

B.A[j-1]=A[j];A[j]=t;

C. A[j]=A[j+1];A[j+1]=t;

D.A[j]=A[j-1];A[j-1]=t;

A.A[i].b>A[p-1].b

B.A[i].b<A[i-1].b

C.A[i].b>A[i-1].b

D. A[i].b<A[p-1].b

A.q+1<n&&A[q+1].a<=r

B. q+1<n&&A[q+1].b<=r

C. q<n&&A[q].a<=r

D. q<n&&A[q].b<=r

A. r=max(r,A[q+1].b)

B. r=max(r,A[q].b)

C. r=max(r,A[q+1].a)

D. q++

2021 年 CSP-J 组第一轮真题讲解

对于有 n 个顶点、m 条边的无向连通图 (m>n),需要删掉(D)条边才能使其成为一棵树。

A.n−1 B.m−n C.m−n−1 D.m−n+1

以下不属于面向对象程序设计语言的是(D)。

A.C++ B.Python C.Java D.C

以下奖项与计算机领域最相关的是(B)。

A.奥斯卡奖 B.图灵奖 C.诺贝尔奖 D.普利策奖

图灵奖:ACM

目前主流的计算机储存数据最终都是转换成(A)数据进行储存。

A.二进制 B.十进制 C.八进制 D.十六进制

以比较作为基本运算,在 N 个数中找出最大数,最坏情况下所需要的最少的比较次数为 (C)。

A. N 2 N^2 N2 B. N N N C. N − 1 N−1 N1 D. N + 1 N+1 N+1

对于入栈顺序为 a,b,c,d,e 的序列,下列(D)不是合法的出栈序列。

A.a,b,c,d,e B.e,d,c,b,a C.b,a,c,d,e D.c,d,a,e,b

对于有 n 个顶点、m 条边的无向连通图 (m>n),需要删掉(D)条边才能使其成为一棵树。

A.n−1 B.m−n C.m−n−1 D.m−n+1

图:n个点,n-1条边。m-(n-1)=m-n+1

二进制数 101.11 对应的十进制数是(C)。

A.6.5 B.5.5 C.5.75 D.5.25

如果一棵二叉树只有根结点,那么这棵二叉树高度为 1。请问高度为 5 的完全二叉树有 (A)种不同的形态?

A.16 B.15 C.17 D.32

在这里插入图片描述
表达式 a*(b+c)*d 的后缀表达式为(B),其中 * 和 + 是运算符。

A.**a+bcd B.abc+*d* C.abc+d** D.*a*+bcd

6 个人,两个人组一队,总共组成三队,不区分队伍的编号。不同的组队情况有( )种。

A.10 B.15 C.30 D.20

A 6 6 ÷ 2 3 ÷ A 3 3 A_6^6\div2^3\div A_3^3 A66÷23÷A33

在数据压缩编码中的哈夫曼编码方法,在本质上是一种(B)的策略。

A.枚举 B.贪心 C.递归 D.动态规划

由 1,1,2,2,3 这五个数字组成不同的三位数有(A)种。

A.18 B.15 C.12 D.24

考虑如下递归算法

solve(n)  
     if n<=1 return 1  
      else if n>=5 return n*solve(n-2)  
      else return n*solve(n-1)  

则调用 solve(7) 得到的返回结果为(C)。

A.105 B.840 C.210 D.420

12357=210

由 洛谷2022 年 CSP 第一轮(初赛)课程总结整理而成!

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值