2021 年 3 月青少年软编等考 C 语言二级真题解析

2021 年 3 月青少年软编等考 C 语言二级真题解析 目录T1. 与指定数字相同的数的个数思路分析T2. 合法 C 标识符思路分析T3. 计算鞍点思路分析T4. 谁考了第 k 名思路分析T5. 石头剪刀布思路分析T1. 与指定数字相同的数的个数题目链接SOJ D1043输出一个整数序列中与指定数字相同的数的个数。时间限制1 s内存限制64 MB输入输入包含三行第一行为n nn表示整数序列的长度n ≤ 100 n \le 100n≤100。第二行为n nn个整数整数之间以一个空格分开。第三行包含一个整数为指定的整数m mm。输出输出为n nn个数中与m mm相同的数的个数。样例输入3 2 3 2 2样例输出2思路分析此题考查一维数组的查询操作属于入门题。此题只需要将输入的n nn个整数存储到数组a中然后在数组a中查询m出现的次数即可。这里可以设置一个计数器变量tot进行统计注意tot需要初始化为0 00。之所以需要用到数组是因为此题将需要查询的数放在了最后进行输入。/* * Name: T1.cpp * Problem: 与指定数字相同的数的个数 * Author: Teacher Gao. * DateTime: 2024/03/26 02:33 */#includeiostreamusingnamespacestd;intmain(){intn,m,a[105];cinn;for(inti1;in;i)cina[i];cinm;inttot0;for(inti1;in;i){if(a[i]m){tot;}}couttotendl;return0;}T2. 合法 C 标识符题目链接SOJ D1044给定一个不包含空白符的字符串请判断是否是 C 语言合法的标识符题目保证这些字符串一定不是 C 语言的保留字。C 语言标识符要求非保留字。只包含字母、数字及下划线_。不能以数字开头。时间限制1 s内存限制64 MB输入一行包含一个字符串字符串中不包含任何空白字符且长度不大于20 2020。输出一行如果它是 C 语言的合法标识符则输出yes否则输出no。样例输入RKPEGX9R;TWyYcp样例输出no思路分析此题考查字符串的遍历与字符检测属于入门题。此题只需要按照题意对输入的字符串进行遍历检测即可。注意确定一个标识符合法需要将整个标识符字符串遍历结束确定没有违反规定才可以。而确定一个标识符非法只需要在遍历过程中检测出一个不合法的字符即可。/* * Name: T2.cpp * Problem: 合法 C 标识符 * Author: Teacher Gao. * DateTime: 2024/03/26 02:36 */#includeiostream#includestringusingnamespacestd;intmain(){string str;cinstr;intlenstr.length();for(inti0;ilen;i)str[i]tolower(str[i]);if((str[0]a||zstr[0])str[0]!_){coutnoendl;return0;}for(inti1;ilen;i){if(0str[i]str[i]9)continue;if(astr[i]str[i]z)continue;if(_str[i])continue;coutnoendl;return0;}coutyesendl;return0;}T3. 计算鞍点题目链接SOJ D1045给定一个5 × 5 5×55×5的矩阵每行只有一个最大值每列只有一个最小值寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素它是所在行的最大值并且是所在列的最小值。例如在下面的例子中第4 44行第1 11列的元素就是鞍点值为8 88。11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25时间限制1 s内存限制64 MB输入输入包含一个5 55行5 55列的矩阵。输出如果存在鞍点输出鞍点所在的行、列及其值如果不存在输出not found。样例输入11 3 5 6 9 12 4 7 8 10 10 5 6 9 11 8 6 4 7 2 15 10 11 20 25样例输出4 1 8思路分析此题考察二维数组的应用难度一般。可以采用标记法先将每行的最大值进行标记然后将每列的最小值进行标记。然后检测标记数组若某个位置被标记了两次则该位置就是鞍点。/* * Name: T3.cpp * Problem: 计算鞍点 * Author: Teacher Gao. * DateTime: 2024/03/26 02:51 */#includeiostreamusingnamespacestd;intmain(){intn,m;inta[10][10],b[10][10]{0};for(inti1;i5;i)for(intj1;j5;j)cina[i][j];for(inti1;i5;i){inttmp0,tmpj0;for(intj1;j5;j){if(tmpa[i][j]){tmpa[i][j];tmpjj;}}b[i][tmpj];}for(intj1;j5;j){inttmp1e9,tmpi0;for(inti1;i5;i){if(tmpa[i][j]){tmpa[i][j];tmpii;}}b[tmpi][j];}for(inti1;i5;i){for(intj1;j5;j){if(2b[i][j]){couti j a[i][j]endl;return0;}}}coutnot found;return0;}T4. 谁考了第 k 名题目链接SOJ D1046在一次考试中每个学生的成绩都不相同现知道了每个学生的学号和成绩求考第k kk名学生的学号和成绩。时间限制1 s内存限制64 MB输入第一行有两个整数分别是学生的人数n nn所求的目标名次k kk。1 ≤ k ≤ n ≤ 100 1 \le k \le n \le 1001≤k≤n≤100。其后有n nn行数据每行包括一个学号整数和一个成绩浮点数中间用一个空格分隔。输出输出第k kk名学生的学号和成绩中间用空格分隔。请用%g输出成绩。样例输入5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9样例输出90788004 68.4思路分析此题考察排序算法难度一般。由于数据量不大可以采用任意O ( n 2 ) O(n^2)O(n2)的排序算法更好的方法是采用结构体排序结合 sort 函数来使用。由于大纲描述较为模糊并未明确表示二级考察结构体在六级中提到 “掌握数据结构及结构的概念”因此这里并没有采用结构体排序的写法而是采用了冒泡排序。/* * Name: T4.cpp * Problem: 谁考了第 k 名 * Author: Teacher Gao. * DateTime: 2024/03/26 03:11 */#includecstdio#includealgorithmusingnamespacestd;intmain(){intn,k,a[105];doubleb[105];scanf(%d%d,n,k);for(inti1;in;i)scanf(%d%lf,a[i],b[i]);for(inti1;in;i){boolflagtrue;for(intj1;jn-i;j){if(b[j]b[j1]){swap(b[j],b[j1]);swap(a[j],a[j1]);flagfalse;}}if(flag)break;}printf(%d %g,a[k],b[k]);return0;}T5. 石头剪刀布题目链接SOJ D1047石头剪刀布是常见的猜拳游戏。石头胜剪刀剪刀胜布布胜石头。如果两个人出拳一样则不分胜负。一天小A AA和小B BB正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的比如“石头 - 布 - 石头 - 剪刀 - 石头 - 布 - 石头 - 剪刀. . . ......”就是以 “石头 - 布 - 石头 - 剪刀” 为周期不断循环的。请问小A AA和小B BB比了n nn轮之后谁赢的轮数多时间限制1 s内存限制64 MB输入输入包含三行。第一行包含三个整数n , n a , n b n, na, nbn,na,nb分别表示比了n nn轮小A AA出拳的周期长度小B BB出拳的周期长度。0 n , n a , n b 100 0 n, na, nb 1000n,na,nb100。第二行包含n a nana个整数表示小A AA出拳的规律。第三行包含n b nbnb个整数表示小B BB出拳的规律。其中0 00表示 “石头”2 22表示 “剪刀”5 55表示 “布”。相邻两个整数之间用单个空格隔开。输出输出一行如果小A AA赢的轮数多输出A如果小B BB赢的轮数多输出B如果两人打平输出draw。样例输入10 3 4 0 2 5 0 5 0 2样例输出A提示对于样例数据猜拳过程为A: 0 2 5 0 2 5 0 2 5 0 B: 0 5 0 2 0 5 0 2 0 5A AA赢了4 44轮B BB赢了2 22轮双方打平4 44轮所以A AA赢的轮数多。思路分析此题考察数组的灵活应用难度一般。可以在输入结束后分别将a[]和b[]按照给定出拳规律重复存储直到存储够n nn项为止然后依次对比每一次出拳进而统计出获胜者。也可以不进行重复存储直接用下标对出拳周期n a nana和n b nbnb分别取余得到对应的出拳结果。需要注意的是这种方法需要将出拳规律存储在下标0 ∼ n a − 1 0 \sim na-10∼na−1和0 ∼ n b − 1 0 \sim nb-10∼nb−1范围内。至于比较出拳结果可以封装成函数使得逻辑结构更清晰。当函数返回0 00时表示平局− 1 -1−1表示小A AA负1 11表示小A AA胜。在主函数内将该函数的返回值进行累加若总数为正则小A AA胜总数为负表示小B BB胜否则表示平局。/* * Name: T5.cpp * Problem: 石头剪刀布 * Author: Teacher Gao. * DateTime: 2024/05/26 15:42 */#includeiostreamusingnamespacestd;intcheck(inta,intb){if(ab)return0;if(a2b0)return-1;if(a5b2)return-1;if(a0b5)return-1;return1;}intmain(){intn,na,nb,tot0;inta[105],b[105];cinnnanb;for(inti0;ina;i)cina[i];for(inti0;inb;i)cinb[i];for(inti0;in;i)totcheck(a[i%na],b[i%nb]);if(tot0)coutAendl;elseif(tot0)coutBendl;elsecoutdrawendl;return0;}