2021年秋季L3班题解

陪你们走过了夏天、秋天和冬天
春天即将到来
你们的步伐愈发坚定
老师可以欣慰地与你们说再见了

题目知识点和难度排序

A. 最长平台:一维数组基本运用

B. 四面楚歌:高精度A+B,思维,规律

C. 通天之汉诺塔:高精度乘法,思维,规律

D. 斜列求和:二维数据一般运用

E. A * B问题:高精度 * 低精度

F. 合影效果:排序

G. 字符串输入输出:字符串输入输出

老师认为的题目难度:

G < A < F < D = E = B < C

题目讲解和AC代码

A. 最长平台:一维数组基本运用

题解:

题意:这题就是要求你在数组中,找到一串最长的数字,这些数字都是相同的,输出这串数据的长度。

做法:读入后,用maxx存储最终答案,用cnt存储每一段相同数字长度,默认从第一位开始存储,然后遍历数组下标0~n-1,如果第i位数组元素和i+1位数组元素相同,cnt++,如果不同,说明要重新开始统计数组长度,比较一下最终答案和当前计数,计数器变成0。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma warning(disable:4996);
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
int a[1200];
cin >> n;//读入数组长度和数组元素
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int maxx = 0;//最终答案
int cnt = 1;//计数器,统计每一段相同数字长度,从第一位开始统计
for (int i = 0; i < n ; i++)
{
if (a[i] == a[i + 1])
cnt++;//如果a[i]和a[i+1]相等,说明长度需要++
else
{
maxx = max(cnt, maxx);//如果不等,说明统计该平台结束,比较一下最终答案和当前计数
cnt = 1;//计数器归零
}
}
cout << maxx;
return 0;
}

B. 四面楚歌:高精度A+B,思维,规律

题解

题意:是一道找规律的题目,画图就会发现,最后答案是a+b+1。

做法:取用最传统的A+B代码,在进行进位前,给c[1],也就是个位+1,然后其他是一模一样的。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[10005] = { 0 }, b[10005] = { 0 };
string s1, s2;
cin >> s1 >> s2;
int len1 = s1.size();
int len2 = s2.size();
int len3 = max(len1, len2) + 1;

for (int i = 0; i <= len1; i++) {
a[len1 - i] = s1[i] - '0';
}
for (int i = 0; i <= len2; i++) {
b[len2 - i] = s2[i] - '0';
}

int c[10100] = { 0 };
for (int i = 1; i <= len3; i++) {
c[i] = a[i] + b[i];
}
//结论为A+B+1,在个位上+1即可,然后做进位处理
c[1] ++;
for (int i = 1; i <= len3; i++) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
int k = len3;
while (c[k] == 0 && k > 1)k--;
for (int i = k; i >= 1; i--) {
cout << c[i];
}
return 0;
}

C. 通天之汉诺塔:高精度乘法,思维,规律

题解

题意:这题是询问汉诺塔移动次数,可能对低年级同学来说找规律比较难,最终规律是2^n-1。

做法:先处理一下2^n次,这题和之前的组合是类似的。只要最后再处理一下-1的问题即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;
int main()
{

int n;
cin >> n;
//结果
int a[100005] = { 0,2 };
int len = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= len; j++)
{
a[j] *= 2;
}
for (int j = 1; j <= len; j++)
{
a[j + 1] += a[j] / 10;
a[j] = a[j] % 10;
if (j == len && a[j + 1] > 0)
{
len++;
}
}
}
a[1]--;//最后各位-1,不会出现各位为0的情况
for (int i = len; i >= 1; i--)
{
printf("%d", a[i]);
}
}

D. 斜列求和:二维数据一般运用

题解

题意:这题根据样例解释可以看出,它的求和先从左下角开始的,
3=3

4=0+4

8=2+3+3

7=2+0+1+3

7=3+0+3

6=3+3

4=4
然后逐渐往上移动,去求斜列的和,是有些难度。

做法:两种做法:1.将二维数组拆分为两部分去处理,一部分是矩形的左下角部分,另一部分是右上角部分;2.将题目里的式子运用到数组里,稍微有些难理解。

代码

方法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int a[505][505];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//存n*n的二维矩阵
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
//这是左下角的部分
for(int i=1;i<=n;i++)
{
int k=n,g=i;//横纵坐标
sum=0;//求和
while(k>0&&g>0)
{
sum=sum+a[k][g];
k--;
g--;
}
cout<<sum<<endl;
}
//这是右上角的部分
for(int i=n-1;i>=1;i--)
{
int k=i,g=n;//横纵坐标
sum=0;//求和
while(k>0&&g>0)
{
sum=sum+a[k][g];
k--;
g--;
}
cout<<sum<<endl;
}
return 0;
}

方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005], ans[2005];
int main()
{
int n;
scanf("%d", &n);

for (int i = 0; i <= n - 1; i++)//特殊的存矩阵方式,坐标位置按题目要来存
for (int j = n - 1; j >= 0; j--)
scanf("%d", &a[i][j]);
for (int i = 1; i <= 2 * n - 1; i++)//需要求的和的长度
{
int sum = 0;
for (int x = 0; x <= n - 1; x++)
{
ans[i] = ans[i] + a[x][-x + i - 1];//按斜率和x的公式求出对应的y,即可求和
}
}
for (int i = 2 * n - 1; i >= 1; i--) cout << ans[i] << endl;
}

E. A*B问题:高精度 * 低精度

题解

题意:就是大数*小数。

做法:就是一个字符串变成数组,然后用这个小数按位相乘,处理进位即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
int a[2000], c[2001];
int main() {
string s1;
int n;
/*读入开始*/
cin >> s1 >>n;
int len1 = s1.size();
/*结果位数最大:为s1和s2长度的最大值+1*/

for (int i = 0; i < len1; i++)
a[len1 - i] = s1[i] - 48;

int len3 = len1 + 8;

//按位相乘,结果存到位置上
for (int i = 1; i <= len1; i++)
{//第一个for循环遍历a
c[i] = a[i] * n;
}
//处理进位
for (int i = 1; i <= len3; i++) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
//处理最高位是否有值
int k = len3;
while (c[k] == 0 && k > 1) k--;
//逆序输出
for (int i = k; i >= 1; i--) {
cout << c[i];
}
return 0;
}

F. 合影效果:排序

题解

题意:将男生和女生分开排序,男生从矮到高排,女生从高到矮排序。

做法:根据male和female存入两个不同的数组,然后可以用sort直接排。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
bool cmp(double a, double b)//写一个排序的函数
{
return a > b;
}
int main()
{
int n;
cin >> n;
int pos1 = 0, pos2 = 0;//男生和女生的数组大小
double boy[50], girl[50];//注意类型是用double类型存储
for (int i = 0; i < n; i++)
{
string sex;
double height;
cin >> sex >> height;
if (sex == "male")//如果是男生,存进boy数组
{
boy[pos1] = height;
pos1++;
}
else//否则存入女生数组
{
girl[pos2] = height;
pos2++;
}
}
sort(boy, boy + pos1);//男生从高到矮排序
sort(girl, girl + pos2, cmp);//女生从矮到高排序
//输出,保留两位小数
for (int i = 0; i < pos1; i++)
printf("%.2lf ", boy[i]);
for (int i = 0; i < pos2; i++)
printf("%.2lf ", girl[i]);
}

G. 字符串输入输出:字符串输入输出

题解

题意:如题所示。

做法:输入一个字符串,然后输出两遍字符串,中间加一个空格。

代码

1
2
3
4
5
6
7
8
9
10
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
cout << s << " " << s;
return 0;
}

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2022 Tangent1231
  • 访问人数: | 浏览次数:

给棉花买点猫粮吧~

支付宝
微信