2023 年 12 月青少年软编等考 C 语言二级真题解析 目录T1. 统计指定范围里的数思路分析T2. 细菌的繁殖与扩散思路分析T3. 错误探测思路分析T4. 单词排序思路分析T5. 计算好数思路分析T1. 统计指定范围里的数题目链接SOJ D1119给定一个数的序列S SS以及一个区间[ L , R ] [L, R][L,R]求序列中介于该区间的数的个数即序列中大于等于L LL且小于等于R RR的数的个数。时间限制1 s内存限制64 MB输入第一行1 11个整数n nn表示序列的长度。0 n ≤ 10000 0 n ≤ 100000n≤10000。第二行n nn个正整数表示序列里的每一个数每个数小于等于10000000 1000000010000000。第三行2 22个整数L LL、R RR分别表示区间的左端点区间的右端点。1 ≤ L ≤ R ≤ 1000000 1 ≤ L ≤ R ≤ 10000001≤L≤R≤1000000。输出输出一个整数表示序列中大于等于L LL且小于等于R RR的数的个数。样例输入5 11 8 1 10 16 1 10样例输出3思路分析此题考查一维数组的查找与统计属于入门题。将给定数据存储在数组中之后依次遍历每一个元素检测其是否在指定范围L LL到R RR之内若是则计数器变量累加1 11最后输出计数器变量的值即可。/* * Name: T1.cpp * Problem: 统计指定范围里的数 * Author: Teacher Gao. * DateTime: 2024/10/02 11:39 */#includeiostreamusingnamespacestd;intmain(){intn,L,R,a[10005]{0};cinn;for(inti1;in;i){cina[i];}cinLR;inttot0;for(inti1;in;i){if(La[i]a[i]R){tot;}}couttotendl;return0;}T2. 细菌的繁殖与扩散题目链接SOJ D1006在边长为9 99的正方形培养皿中正中心位置有m mm个细菌。假设细菌的寿命仅一天但每天可繁殖10 1010个后代而且这10 1010个后代有两个分布在原来的单元格中其余的均匀分布在其四周相邻的八个单元格中。求经过n ( 1 ≤ n ≤ 4 ) n(1≤n≤4)n(1≤n≤4)天后细菌在培养皿中的分布情况。时间限制1 s内存限制64 MB输入输入为两个整数第一个整数m mm表示中心位置细菌的个数2 ≤ m ≤ 30 2 ≤ m ≤ 302≤m≤30第二个整数n nn表示经过的天数1 ≤ n ≤ 4 1 ≤ n ≤ 41≤n≤4。输出输出九行九列整数矩阵每行的整数之间用空格分隔。整个矩阵代表n nn天后细菌在培养皿上的分布情况。样例输入2 1样例输出0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 2 4 2 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0思路分析此题考查二维数组的使用属于模拟算法难度一般。此题可以用方向增量的方式来简化八邻域的细菌繁衍。此外注意处理好题目中的细菌寿命只有一天这个细节即可。/* * Name: T2.cpp * Problem: 细菌的繁殖与扩散 * Author: Teacher Gao. * DateTime: 2024/02/29 03:10 */#includeiostream#includecstringusingnamespacestd;// 方向增量从左上角开始顺时针旋转intdx[8]{-1,-1,-1,0,1,1,1,0};intdy[8]{-1,0,1,1,1,0,-1,-1};intmain(){inta[15][15]{0},b[15][15]{0};intn;cina[5][5]n;for(intday1;dayn;day){for(intx1;x9;x){for(inty1;y9;y){// a[x][y] 格子中没有细菌if(!a[x][y])continue;// a[x][y] 格子中的细菌繁衍 10 个后代其中 2 个留在此处b[x][y]a[x][y]*2;// 其余 8 个分布在周围for(intk0;k8;k){intnxxdx[k];intnyydy[k];// 越界检测if(1nxnx91nyny9)b[nx][ny]a[x][y];}}}// 为新一天的繁衍做准备重新初始化细菌数量memcpy(a,b,sizeof(b));// 今天的细菌在今天结束时会死亡memset(b,0,sizeof(b));}for(intx1;x9;x){for(inty1;y9;y)couta[x][y] ;coutendl;}return0;}T3. 错误探测题目链接SOJ D1022给定n × n n \times nn×n由0 00和1 11组成的矩阵如果矩阵的每一行和每一列的1 11的数量都是偶数则认为符合条件。你的任务就是检测矩阵是否符合条件或者在仅改变一个矩阵元素的情况下能否符合条件。“改变矩阵元素” 的操作定义为0 00变成1 11或者1 11变成0 00。时间限制1 s内存限制64 MB输入输入n 1 n 1n1行第1 11行为矩阵的大小n nn0 n 100 0 n 1000n100以下n nn行为矩阵的每一行的元素元素之间以一个空格分开。输出如果矩阵符合条件则输出OK如果矩阵仅改变一个矩阵元素就能符合条件则输出需要改变的元素所在的行号和列号以一个空格分开。如果不符合以上两条输出Corrupt。样例输入 14 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1样例输出 1OK样例输入 24 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1样例输出 22 3样例输入 34 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1样例输出 3Corrupt思路分析此题考察二维数组的用法属于入门题。对输入数据分别按行和列统计1 11的个数并分别记录下1 11的个数为奇数个的行数totr和行号row、列数totc和列号col。若行数totr或列数totc大于1 11则不可行若行数totr和列数totc均等于1 11则修改行号row和列号col的交叉位置即可若行数totr和列数totc均等于0 00则符合条件。事实上我们可以使用两个一维数组来替代二维数组换言之只需统计无需存储。甚至更进一步可以只用一个一维数组来统计每列1 11的个数。因为程序是按行进行输入的每行的情况可以在输入的过程中就进行统计求解。/* * Name: T3.cpp * Problem: 错误探测 * Author: Teacher Gao. * DateTime: 2024/05/23 19:54 */#includeiostreamusingnamespacestd;intmain(){intn,x;introw[105]{0},col[105]{0};cinn;for(inti1;in;i){for(intj1;jn;j){cinx;row[i]row[i]x;// 按行统计col[j]col[j]x;// 按列统计}}// 按行查找inttotr0,rowi;for(inti1;in;i){if(row[i]%2){totr;rowii;}}// 按列查找inttotc0,coli;for(inti1;in;i){if(col[i]%2){totc;colii;}}// 检测结果if(totr1||totc1)coutCorruptendl;elseif(totr1totc1)coutrowi coliendl;elsecoutOKendl;return0;}T4. 单词排序题目链接SOJ D1266输入一行单词序列相邻单词之间由1 11个或多个空格间隔请按照字典序输出这些单词要求重复的单词只输出一次。区分大小写。时间限制1 s内存限制64 MB输入一行单词序列长度小于10000 1000010000最少1 11个单词最多100 100100个单词每个单词长度不超过50 5050单词之间用至少1 11个空格间隔。数据不含除字母、空格外的其他字符。输出按字典序输出这些单词重复的单词只输出一次。样例输入She wants to go to Peking University to study Chinese样例输出Chinese Peking She University go study to wants思路分析此题考查字符串的查找与排序属于入门题。用string数组存储所有字符串之后分别用sort()函数和unique()函数即可达到按字典序排序并去重的效果。/* * Name: T4.cpp * Problem: 单词排序 * Author: Teacher Gao. * DateTime: 2024/11/16 00:41 */#includeiostream#includestring#includealgorithmusingnamespacestd;intmain(){intn0;string s[105];while(cins[n]);sort(s1,sn);intmunique(s1,sn)-(s1);for(inti1;im;i){couts[i]endl;}return0;}T5. 计算好数题目链接SOJ D1074若将一个正整数化为二进制数在此二进制数中我们将数字1 11的个数多于数字0 00的个数的这类二进制数称为好数。例如( 13 ) 10 ( 1101 ) 2 (13)10 (1101)2(13)10(1101)2其中1 11的个数为3 330 00的个数为1 11则此数是好数( 10 ) 10 ( 1010 ) 2 (10)10 (1010)2(10)10(1010)2其中1 11的个数为2 220 00的个数也为2 22则此数不是好数( 24 ) 10 ( 11000 ) 2 (24)10 (11000)2(24)10(11000)2其中1 11的个数为2 220 00的个数为3 33则此数不是好数。对于给定的n nn写程序求出1 ∼ n 1 \sim n1∼n之中包括1 11与n nn中的好数个数。时间限制1 s内存限制64 MB输入一个整数题目中的n nnn ≤ 1000 n ≤ 1000n≤1000。输出一个整数表示1 ∼ n 1 \sim n1∼n之中包括1 11与n nn中的好数个数。样例输入10样例输出5思路分析此题主要考查进制转换即短除法难度一般。短除法的实现可以用while语句注意在做短除法之前需要清空统计1 11和0 00数量的计数器变量。见示例代码。/* * Name: T5.cpp * Problem: 计算好数 * Author: Teacher Gao. * DateTime: 2024/09/15 15:24 */#includeiostreamusingnamespacestd;intmain(){intn,tot0;cinn;for(inti1;in;i){inttmpi,t10,t00;while(tmp){if(tmp%2)t1;elset0;tmp/2;}if(t1t0)tot;}couttotendl;return0;}