目录
- 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. * Date&Time: 2024/11/14 19:10 */#include<iostream>usingnamespacestd;intmain(){intsum=0,x,ans;for(inti=1;i<=11;i++){cin>>x;sum+=x;}cin>>ans;cout<<sum-ans;return0;}T2. 小白鼠再排队
题目链接:SOJ D1172
n nn只小白鼠(1 < n < 100 1 < n < 1001<n<100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用red,blue等字符串来表示。不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。
时间限制: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. * Date&Time: 2024/11/14 19:06 */#include<iostream>#include<algorithm>usingnamespacestd;structret{intweight;string hat;}a[105];boolcmp(ret a,ret b){returna.weight<b.weight;}intmain(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>a[i].weight>>a[i].hat;}sort(a+1,a+n+1,cmp);for(inti=1;i<=n;i++){cout<<a[i].hat<<endl;}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 nn(n < 1000 n<1000n<1000),表示共有多少个需要处理的车站名。
从第2 22到第n + 1 n+1n+1行是这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. * Date&Time: 2024/11/14 19:13 */#include<iostream>#include<string>usingnamespacestd;intmain(){intn;cin>>n;while(n--){string s;cin>>s;inttot=0;boolflag=false;for(inti=0;i<s.size();i++){if('A'<=s[i]&&s[i]<='Z'&&!flag){flag=!flag;tot+=2;}elseif('a'<=s[i]&&s[i]<='z'&&flag){flag=!flag;tot+=2;}else{tot++;}}cout<<tot<<endl;}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. * Date&Time: 2026/08/31 17:03 */#include<iostream>usingnamespacestd;chara[105][105];intn,m;intmain(){cin>>n>>m;for(inti=1;i<=n;++i){for(intj=1;j<=m;++j){cin>>a[i][j];}}inttot=0;for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){if(a[i][j]=='#'){tot++;if(j+1<=m&&a[i][j+1]=='#')a[i][j+1]='.';elseif(i+1<=n&&a[i+1][j]=='#')a[i+1][j]='.';}}}cout<<tot;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. * Date&Time: 2024/11/14 19:48 */#include<iostream>#include<string>usingnamespacestd;intmain(){string s;cin>>s;s+=' ';chart=' ',ans_ch=' ';inttot=0,ans_sum=0;for(inti=0;i<s.size();i++){if(s[i]==t){tot++;}else{if(tot>ans_sum){ans_sum=tot;ans_ch=t;}tot=1;t=s[i];}}cout<<ans_ch<<" "<<ans_sum;return0;}