CSP 2019 入门级第一轮真题讲解(完善程序不擅长不讲)

第 1 题

中国的国家顶级域名是(A

A. cn        B.ch        C. chn        D.china

这一题自己背,当然还是讲一下各种域名来复习一下。

1. 顶级域名(TLD)

顶级域名是域名系统中最顶层的域名,它分为两类:

  • 通用顶级域名(gTLD)

    • .com:商业网站(最常见的域名后缀)
    • .org:组织或非营利机构
    • .net:网络服务提供商
    • .info:信息网站
    • .biz:商业用途
    • .name:个人网站
    • .pro:专业人士
    • .xyz:泛用型,适用于各种用途
  • 国家代码顶级域名(ccTLD)

    • .cn:中国
    • .us:美国
    • .uk:英国
    • .jp:日本
    • .de:德国
    • .fr:法国
    • .ca:加拿大

2. 二级域名

二级域名位于顶级域名下,可以用来进一步细分和组织网站。通常用来表示特定的组织或公司。例如:

  • example.comexample 是二级域名,com 是顶级域名。
  • google.co.ukgoogle 是二级域名,co 是三级域名,uk 是顶级域名。

3. 子域名

子域名是在二级域名下进一步划分的域名,用于创建特定的分区。例如:

4. 新顶级域名(New gTLD)

新顶级域名是近年来引入的顶级域名,用于提供更多的选择和灵活性。例如:

  • .app:应用程序相关网站
  • .tech:技术相关网站
  • .store:在线商店
  • .online:通用类型
  • .club:俱乐部相关网站

5. 功能性域名

这些域名通常用于特定的功能或服务:

  • .edu:教育机构(主要用于高等教育机构)
  • .gov:政府网站(主要用于美国政府机构)
  • .mil:军事网站(主要用于美国军事机构)

6. 国际化域名(IDN)

国际化域名允许使用非拉丁字符的域名,例如中文、阿拉伯文等:

  • .中国.xn--fiqs8s):中文顶级域名
  • .한국.xn--3e0b707e):韩文顶级域名

7. 临时和虚拟域名

这些域名通常用于特定的测试、开发或虚拟用途:

  • .test:用于测试和开发
  • .example:用于文档和示例

相信应该写的很清楚了

第 2 题

二进制数 11 1011 1001 011111 1011 1001 0111 和 01 0110 1110 101101 0110 1110 1011 进行按位与运算的结果是(D)。

编者注:原题为“逻辑与”,但是根据题意应当是按位与。

 A. 01 0010 1000 101101 0010 1000 1011        B. 01 0010 1001 001101 0010 1001 0011        

C. 01 0010 1000 000101 0010 1000 0001        D. 01 0010 1000 001101 0010 1000 0011

这里也是讲到了逻辑运算符,那么就全部讲一下好吧。

1.与 & 只有两个都为1才为1,否则为0

2.或 只要有一个为1就为1

3.异或 ⊕ 不同为1否则为0

那么说到异或怎么记忆呢?

可以做不进位加法。

4.非 ~ 也就是取反

下面看题目:

        11 1011 1001 011111 1011 1001 0111

        01 0110 1110 101101 0110 1110 1011

——————————————————————

        01 0010 1000 001101 0010 1000 0011

答案很明显选D

第 3 题

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

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

这道题目很简单。

32位整型变量有32位,每个字节由8位组成,所以32位除以8位等于4字节。

既然说到了字节,那么顺带复习一下我们的进制:

  • 1 字节 = 8 位
  • 1 千字节 (KB) = 1024 字节
  • 1 兆字节 (MB) = 1024 KB
  • 1 吉字节 (GB) = 1024 MB
  • 1 太字节 (TB) = 1024 GB

要记住几乎都是1024

第 4 题

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

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

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

A. s = a - c;        B. s = a - b        C. s = s - c;        D. s = b - c;

这道题有一点点绕,但是还是太简单了

你看这个代码的意思等于什么:

就是s=a,s=s-c

所以明显选A啊

∵s=a

∴s=a-c

 第 5 题

设有 100 个已排好序的数据元素,采用折半查找时,最大比较次数为(A

A. 7        B. 10        C. 6        D. 8

折半查找也就是二分查找,这个懂得都懂,不懂得在评论区问吧,太简单了……

折半查找最坏情况为log_2 n+1。

那么离100最近的是2^6,所以最大比较次数为6+1=7

第 6 题 

链表不具有的特点是(D

A. 插入删除不需要移动元素        B. 不必事先估计存储空间 

C. 所需空间与线性表长度成正比        D. 可随机访问任一元素

终于到不擅长的题目了……

链表的主要特点包括:

1. 动态大小

  • 特点:链表的大小可以动态调整。可以在运行时插入或删除元素,而不需要事先分配固定大小的内存。
  • 好处:灵活性高,不需要预设大小。

2. 节点结构

  • 特点:链表由多个节点组成。每个节点包含数据和指向下一个节点的指针(在单链表中)或指向前后节点的指针(在双链表中)。
  • 组成
    • 数据部分:存储实际的数据。
    • 指针部分:指向链表中的下一个节点(或前后节点)。

3. 插入和删除操作效率高

  • 特点:在链表中插入或删除节点的时间复杂度通常是 O(1),前提是知道插入或删除的位置。
  • 好处:特别适合需要频繁插入和删除操作的应用场景。

4. 不支持随机访问

  • 特点:链表不支持直接访问特定位置的元素。需要从头节点开始逐步访问,直到找到目标节点。
  • 缺点:访问特定元素的时间复杂度是 O(n),其中 n 是链表的长度。

5. 内存开销

  • 特点:每个节点除了存储数据外,还需要额外的内存来存储指针(或两个指针,在双链表中)。
  • 缺点:相比于数组,链表的内存开销较大。

6. 链表类型

  • 单链表:每个节点只有一个指针,指向下一个节点。
  • 双链表:每个节点有两个指针,分别指向下一个节点和前一个节点。
  • 循环链表:链表的最后一个节点指向第一个节点,形成一个环。
  • 双向循环链表:结合了双链表和循环链表的特点,节点既指向下一个节点,也指向前一个节点,并且形成一个环。

7. 灵活性

  • 特点:链表可以很容易地扩展以存储不同类型的数据(如整数、字符、对象等)。
  • 好处:能够根据需要设计适应性较强的数据结构。

8. 链表与数组比较

  • 内存分配:链表的内存是动态分配的,而数组是静态分配的。
  • 数据访问:链表的访问速度较慢(需要遍历),数组则可以直接通过索引访问。

9. 常见应用

  • 实现栈和队列:链表常用于实现栈(LIFO)和队列(FIFO)数据结构。
  • 动态数据集合:适合处理大小不固定的数据集合,或频繁发生插入和删除操作的场景。

至于为什么不擅长,因为懒得背

第 7 题

把 8 个同样的球放在 5 个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的分法?(C

提示:如果 8 个球都放在一个袋子里,无论是哪个袋子,都只算同一种分法。

A. 22        B. 24        C. 18         D. 20

这一题排列组合,我学一会……

其实会的但是……

笑死我直接枚举,这个枚举都会,自己慢慢画吧……

第 8 题

一棵二叉树如右图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为 1,若某结点的下标为 i,则其左孩子位于下标 2_i 处、右孩子位于下标 2_i+1 处),则该数组的最大下标至少为(C)。

A. 6         B. 10        C. 15        D. 12

这一题首先不是要你蒙,不过可以蒙……

ABD是偶数,C是奇数,选C……

结论完全正确,只是要知道为什么。

是因为最下面的叶节点在右边,所以下标应为2_i-1,且选项中只有15是单数,所以选C

 第 9 题

100 以内最大的素数是(B)。

A. 89         B. 97         C. 91         D. 93

这一题似乎不用多说,因为ABCD中最大的是97,而且97是素数所以选B

第 10 题 

319 和 377 的最大公约数是(C)。

A. 27         B. 33         C. 29         D. 31

考虑到在考场上要用短除法来做,所以还是示范一下吧:

确实有一点难度,因为还是挺难想到的

第 11 题

新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。

  • 方案一:每次连续跑 3 公里可以消耗 300 千卡(耗时半小时);
  • 方案二:每次连续跑 5 公里可以消耗 600 千卡(耗时 11 小时)。

小胖每周周一到周四能抽出半小时跑步,周五到周日能抽出一小时跑步。
另外,教练建议小胖每周最多跑21公里,否则会损伤膝盖。
请问如果小胖想严格执行教练的训练方案,并且不想损伤膝盖,每周最多通过跑步消耗多少千卡?(C

A. 3000        B. 2500        C. 2400         D. 2520

这道题没有难度,因为是最基础的数学题。

因为跑5公里最划算,所以3*600=1800

再把剩下的加一下:1800+2*300=2400

注意:这是重点哦,不一定所有的都要想让利益最大,万一出题组发神经让你掉下陷阱。

例如跑5公里不能和3公里加在一起是X公里,可能用小的共优。

第 12 题

—副纸牌除掉大小王有 52 张牌,四种花色,每种花色 13 张。

假设从这 52 张牌中随机抽取 13 张纸牌,则至少(A)张牌的花色一致。

A. 4         B. 2         C. 3         D. 5

这不是我一年级奥数题嘛……

13/4=3……1

3+1=4

为什么呢……

因为让结果最少,每个花色轮流一遍就好了

第 13 题

—些数字可以颠倒过来看,例如 0,1,8 颠倒过来还是本身,6 颠倒过来是 9 颠倒过来看还是 6,其他数字颠倒过来都不构成数字。
类似的,一些多位数也可以颠倒过来看,比如 106 颠倒过来是 901。假设某个城市的车牌只由 5 位数字组成,每一位都可以取 0 到 9。
请问这个城市最多有多少个车牌倒过来恰好还是原来的车牌?(C

A. 60         B. 125         C. 75         D. 100

因为只有0,1,8倒过来是它自己,所以每一位都只能是0,1,8.
但是在第1,2,4,9位填6或9还是相同的。
所以有5 * 5 * 3 * 1 * 1 = 75。

选C

第 14 题

假设一棵二叉树的后序遍历序列为 DGJHEBIFCA,中序遍历序列为 DBGEHJACIF,则其前序遍历序列为(B)。

A. ABCDEFGHIJABCDEFGHIJ         B. ABDEGHJCFIABDEGHJCFI

C. ABDEGJHCFIABDEGJHCFI        D. ABDEGHJFICABDEGHJFIC

 这个是二叉树题,我以前博客写过怎么遍历二叉树,所以有需要的可以去看

遍历二叉树

这题选B(不是偷懒是以前讲的很详细了)

第 15 题

以下哪个奖项是计算机科学领域的最高奖?(A

 A. 图灵奖         B. 鲁班奖        C. 诺贝尔奖         D. 普利策奖

这一道题本身没什么好讲的,但是有一些知识点希望大家记一下:

1.姚期智于2000年获图灵奖

2.王选因发明汉字激光照排系统,被誉为“当代毕昇”(为了纪念王院士有中国计算机学会王选奖)

3.记住计算机领域的奖不只有图灵奖,但是图灵奖最容易考

 第 16 题

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

#include <cstdio>
#include <cstring>
using namespace std;
char st[100];
int main() {
    scanf("%s", st);
    int n = strlen(st);
    for (int i = 1; i <= n; ++i) {
        if (n % i == 0) {
            char c = st[i - 1];
            if (c >= 'a')
                st[i - 1] = c - 'a' + 'A';
        }
    }
    printf("%s", st);
    return 0;
}	

1.输入的字符串只能由小写字母或大写字母组成。(×) 

没人规定只能输入字母,明显是错

2.若将第 8 行的 i = 1 改为 i = 0,程序运行时会发生错误。(

这个把i改成0的话少输入了一个,所以肯定是对的

3.将第 8 行的 i <= n 改为 i * i <= n,程序运行结果不会改变。(×

i * i代表了什么?少判断了很多啊,一般我们只有优化代码(仅限有规律的)才用i*i。

相当于i=1,i<=sqrt(n)。所以明显是错的啊

4.若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。(

肯定是对的,因为大致意思是把n的因子(不含自己)的小写字母转成大写字母,所以啊,打勾

5.若输入的字符串长度为 18,那么输入的字符串跟输出的字符串相比,至多有(B)个字符不同。

A. 18         B. 6         C. 10         D. 1

18的最大的因子(不含自己)是6。所以果断选B。

6.若输入的字符串长度为(B),那么输入的字符串跟输出的字符串相比,至多有 36 个字符不同。

 A. 36         B. 100000         C. 1         D. 128

这一题不必多说了看一下因子就可以了,有100000是36的倍数,选B

第 17 题

#include<cstdio>
using namespace std;
int n, m;
int a[100], b[100];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
        a[i] = b[i] = 0;
    for (int i = 1; i <= m; ++i) {
        int x, y;
        scanf("%d%d", &x, &y);
        if (a[x] < y && b[y] < x) {
            if (a[x] > 0)
                b[a[x]] = 0;
            if (b[y] > 0)
                a[b[y]] = 0;
            a[x] = y;
            b[y] = x;
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        if (a[i] == 0)
            ++ans;
        if (b[i] == 0)
            ++ans;
    }
    printf("%d", ans);
    return 0;
}

假设输入的 n 和 m 都是正整数,x 和 y 都是在 [1,n] 的范围内的整数,完成下面的判断题和单选题:

判断题

1.当 m>0 时,输出的值一定小于 2n。(

这一题很明显,因为如果m=0,那么ans=2n,如果m>0,那么ans肯定是小于2n的啊,

故是对的

2.执行完第 27 行的 ++ans 时,ans —定是偶数。(×

这个是弱智题,谁说就一定是偶数的,为什么不能是奇数呢?

上证据:

3.a[i] 和 b[i] 不可能同时大于 0。(×

题目没说啊,所以是错的

4.右程序执行到第 13 行时,x 总是小于 y,那么第 15 行不会被执行。(×

这个题目有点简单阿。就是这一眼错的是CSP吗?

选择题

5.若m 个 x 两两不同,且 m 个 y 两两不同,则输出的值为(A

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

这个多看看代码就行了,真的没什么好讲的……

6.m 个 x 两两不同,且 m 个 y 都相等,则输出的值为(A

A. 2n−2        B. 2n         C.2m         D. 2n−2m

这个是真的不好讲……因为你模拟一下就好了

第 18 题

#include <iostream>
using namespace std;
const int maxn = 10000;
int n;
int a[maxn];
int b[maxn];
int f(int l, int r, int depth) {
    if (l > r)
        return 0;
    int min = maxn, mink;
    for (int i = l; i <= r; ++i) {
        if (min > a[i]) {
            min = a[i];
            mink = i;
        }
    }
    int lres = f(l, mink - 1, depth + 1);
    int rres = f(mink + 1, r, depth + 1);
    return lres + rres + depth * b[mink];
}
int main() {
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    for (int i = 0; i < n; ++i)
        cin >> b[i];
    cout << f(0, n - 1, 1) << endl;
    return 0;
}

1.如果 a 数组有重复的数字,则程序运行时会发生错误。(×

这个是常识,但是还是要讲的

一般程序运行时报错是:数组越界(其他几乎没有)

2.如果 b 数组全为 0,则输出为 0。(

看这一行:

return lres + rres + depth * b[mink];

注意*b[mink],b全部为0啊,怎么*都是0。

3.当n=100 时,最坏情况下,与第 12 行的比较运算执行的次数最接近的是:(A)。

A. 5000         B. 600         C. 6         D. 100

100+99+98+……+3+2+1=5050。

至于怎么算呢……

(100+1)*100/2=5050

所以这就是等差数列。

公式自己背:

(前项+后项)*项数(记得不是减1)/2

4.当n=100时,最好情况下,与第12行的比较运算执行的次数最接近的是(C

A.100         B.6         C.5000         D.600

这里给一下提示:就是二分。

二分在前面的题讲过了

100的话在log_26~log_27之间。

也就是说答案在600~700之间,所以选D。

5.当n=10 时,若 b 数组满足,对任意 0≤i<n,都有 b[i] = i + 1,那么输出最大为(D)。

A.386         B.383         C.384         D.385

这边的话画一下图模拟得1*1+2*2+3*3+……+9*9+10*10=385

6.当 n=100 时,若 b 数组满足,对任意 0≤i<n,都有 b[i]=1,那么输出最小为(B)。

A.582         B.580         C.579         D.581

这边也是画一下图就行了:1*1+2*2+4*3+8*4+16*5+32*6+37*7=580

有时间会出2020年的,但是作者脑子被狗吃了,小蓝本第9章不想看。

如果对你有帮助点个赞(据说能CSP RP++的哦)

2023 csp-j入门级第一轮试题是中国计算机科学会议(CSP)针对初学者设计的一道题。根据题目的具体要求,试题内容可能涉及算法、编程语言、数据结构等方面的知识。 对于这样的试题,学生们需要运用自己所学的知识和技能,通过编程实现题目要求。例如,可能需要设计一个算法来解决一个具体的问题,或者使用特定的数据结构来组织和处理数据。 为了完成这样的试题,学生们首先需要理解题目的要求和限制条件,确保对题目中涉及的概念和术语有所了解。接下来,他们需要分析问题,确定解决问题的方法和步骤。在实际编程实现时,可以选择合适的编程语言和工具,并按照题目要求进行编码。 在完成编码后,学生们需要进行测试和调试,确保程序能够正确运行并得到正确的结果。在测试过程中,可以使用一些已知的测试用例来验证程序的正确性,并对程序进行优化,以提高其性能。 最后,将代码提交,并等待评审结果。评审过程可能涉及代码质量、算法复杂度、正确性等方面的考量。根据评审结果,学生们可以了解自己的编程水平和不足之处,并进行相应的学习和提高。 总体来说,解答2023 csp-j入门级第一轮试题需要学生在编程基础上运用算法和数据结构的知识,进行问题的分析和解决。通过这样的学习和实践,学生们可以提高自己的编程能力,并逐渐成长为优秀的程序员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值