2022 年 6 月青少年软编等考 C 语言二级真题解析 📅 发布时间:2026/9/1 11:56:47 👁 浏览次数: 目录T1. 多余的数思路分析T2. 小白鼠再排队思路分析T3. 打字员思路分析T4. 最好的草思路分析T5. 字符串中最长的连续出现的字符思路分析T1. 多余的数题目链接SOJ D1171小A AA同学在完成一个数学题求给定的10 1010个整数的和。小A AA同学在求完之后发现和参考答案对不上检查后发现在求和过程中多计算了一个数其他过程没有问题。现给出小A AA计算用的11 1111个数以及正确的参考答案请算出小A AA同学多计算的那一个数。时间限制1 s内存限制64 MB输入第一行11 1111个正整数每个数小于等于1000000 10000001000000。第二行一个整数表示参考答案。输出一个整数表示多计算的那一个数。样例输入2 4 6 8 1 3 5 7 9 5 11 54样例输出7提示样例中原有的10 1010个数为2 4 6 8 1 3 5 9 5 11 2\ 4\ 6\ 8\ 1\ 3\ 5\ 9\ 5\ 1124681359511和为54 5454多余的数为7 77。思路分析此题考查循环结构属于入门题。先求出11 1111个元素的和然后减去正确结果即可。/* * Name: T1.cpp * Problem: 多余的数 * Author: Teacher Gao. * DateTime: 2024/11/14 19:10 */#includeiostreamusingnamespacestd;intmain(){intsum0,x,ans;for(inti1;i11;i){cinx;sumx;}cinans;coutsum-ans;return0;}T2. 小白鼠再排队题目链接SOJ D1172n nn只小白鼠1 n 100 1 n 1001n100每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用redblue等字符串来表示。不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。时间限制1 s内存限制64 MB输入输入第一行为一个整数n nn表示小白鼠的数目。下面有n nn行每行是一只白鼠的信息。第一个为正整数表示白鼠的重量不超过整型范围第二个为字符串表示白鼠的帽子颜色字符串长度不超过10 1010个字符。注意白鼠的重量各不相同。输出按照白鼠的重量从小到大的顺序输出白鼠的帽子颜色。样例输入3 30 red 50 blue 40 green样例输出red green blue思路分析此题考查排序算法属于入门题。由于数据量较小可以采用任意时间复杂度为O ( n 2 ) O(n^2)O(n2)的算法更好的方式是采用结构体排序具体参考示例代码/* * Name: T2.cpp * Problem: 小白鼠再排队 * Author: Teacher Gao. * DateTime: 2024/11/14 19:06 */#includeiostream#includealgorithmusingnamespacestd;structret{intweight;string hat;}a[105];boolcmp(ret a,ret b){returna.weightb.weight;}intmain(){intn;cinn;for(inti1;in;i){cina[i].weighta[i].hat;}sort(a1,an1,cmp);for(inti1;in;i){couta[i].hatendl;}return0;}T3. 打字员题目链接SOJ D1173有一个打字员他打字的时候有个习惯从来不用S h i f t \tt{Shift}Shift来切换大小写只用C a p s L o c k \tt{Caps Lock}CapsLock。现在给他一个地铁站的名字你需要写一个程序来告诉他他需要敲击多少下键盘才能打出这个地铁站名。时间限制1 s内存限制64 MB输入第一行输入一个数字n nnn 1000 n1000n1000表示共有多少个需要处理的车站名。从第2 22到第n 1 n1n1行是这n nn个车站名。车站名由英文字母构成名字的长度不会超过100 100100个字符。已知开始时键盘是输入小写字母的状态。输出这个打字员敲击键盘的次数。样例输入5 BeiJingDaXueDongMen AAAaaaBBBbbbABAB AmericanRAILWAY AaAaAa DFjfkdaB样例输出31 21 18 12 11思路分析此题考查字符串遍历难度入门。首先设置一个标记变量表示键盘的大小写状态初始为false表示小写。之后依次遍历每一个字母即可若需要切换大小写则进行切换并将按键操作次数加2 22否则加1 11。/* * Name: T3.cpp * Problem: 打字员 * Author: Teacher Gao. * DateTime: 2024/11/14 19:13 */#includeiostream#includestringusingnamespacestd;intmain(){intn;cinn;while(n--){string s;cins;inttot0;boolflagfalse;for(inti0;is.size();i){if(As[i]s[i]Z!flag){flag!flag;tot2;}elseif(as[i]s[i]zflag){flag!flag;tot2;}else{tot;}}couttotendl;}return0;}T4. 最好的草题目链接SOJ D1174奶牛B e s s i e \tt{Bessie}Bessie计划好好享受柔软的春季新草。新草分布在R RR行C CC列的牧场里。它想计算一下牧场中的草丛数量。在牧场地图中每个草丛要么是单个#要么是有公共边的相邻两个#。给定牧场地图计算有多少个草丛。例如考虑如下5 55行6 66列的牧场地图.#.... ..#... ..#..# ...##. .#....这个牧场有5 55个草丛一个在第一行一个在第二列横跨了二、三行一个在第三行一个在第四行横跨了四、五列最后一个在第五行。时间限制1 s内存限制64 MB输入第一行包含两个整数R RR和C CC中间用单个空格隔开。接下来R RR行每行C CC个字符描述牧场地图。字符只有#或.两种。1 ≤ R , C ≤ 100 1 \le R, C \le 1001≤R,C≤100。输出输出一个整数表示草丛数。样例输入5 6 .#.... ..#... ..#..# ...##. .#....样例输出5思路分析此题考查二维数组的基本操作属于入门题。与 2021 年 12 月二级 T4 类似难度更低按照题目意思进行模拟即可。当检测到某一个位置是草丛的时候我们应该要检测周围四个方向是否还有相邻草丛将它们算作一个草丛。事实上我们会从左向右自上而下进行检测因此只需要检测当前位置的右侧与下方是否有相邻草丛即可若有则将其标记为已统计。需要注意的是根据题目描述草丛大小为1 11或2 22因此右侧和下方的草丛只能选择一个进行标记方便起见我们优先选择右侧进行标记若右侧已经标记过则选择下方进行标记。更直接的方式是把与当前位置进行配对位置的草 “拔掉”就是把相应的.修改为#最后输出#的数量即可。/* * Name: T4.cpp * Problem: 最好的草 * Author: Teacher Gao. * DateTime: 2026/08/31 17:03 */#includeiostreamusingnamespacestd;chara[105][105];intn,m;intmain(){cinnm;for(inti1;in;i){for(intj1;jm;j){cina[i][j];}}inttot0;for(inti1;in;i){for(intj1;jm;j){if(a[i][j]#){tot;if(j1ma[i][j1]#)a[i][j1].;elseif(i1na[i1][j]#)a[i1][j].;}}}couttot;return0;}T5. 字符串中最长的连续出现的字符题目链接SOJ D1175求一个字符串中最长的连续出现的字符输出该字符及其出现次数。字符串中无空白字符空格、回车和tab \text{tab}tab如果这样的字符不止一个则输出出现最早的字符。时间限制1 s内存限制64 MB输入一行一个不包含空白字符的字符串字符串长度小于200 200200。输出一行输出最长的连续出现的字符及其最长的连续出现次数中间以一个空格分开。样例输入aaaaadbbbbbcccccccdddddddddd样例输出d 10思路分析此题考查字符串遍历属于入门题。按照题目要求进行每一个字符连续出现次数的统计即可具体来说设置一个临时变量t tt表示当前正在统计的字符若字符s [ i ] t s[i] ts[i]t则t tt的出现次数累加1 11否则检测t tt是否是出现次数最多的字符之后将t tt更新为s [ i ] s[i]s[i]并重新统计t tt出现的次数。为了能够让最后一个字符也参与比较我们给s ss后面拼接一个空白符。/* * Name: T5.cpp * Problem: 字符串中最长的连续出现的字符 * Author: Teacher Gao. * DateTime: 2024/11/14 19:48 */#includeiostream#includestringusingnamespacestd;intmain(){string s;cins;s ;chart ,ans_ch ;inttot0,ans_sum0;for(inti0;is.size();i){if(s[i]t){tot;}else{if(totans_sum){ans_sumtot;ans_cht;}tot1;ts[i];}}coutans_ch ans_sum;return0;}