Advertisement

2024年全国青少年信息素养大赛复赛真题及题解(C++算法创意实践挑战赛- 小学组)

阅读量:

2024年全国青少年信息素养大赛复赛真题及题解: C++算法创意实践挑战赛 - 小学组

在这里插入图片描述
【第一题】玫瑰花地的面积
题目描述:

在一个宁静的小镇上,有位园丁想为她的玫瑰花地建围栏。这片花地是个长方形,长度 10米,宽度 5米。但园丁不知道怎么计算玫瑰花地的面积,于是他向小兔子求助。聪明的小兔子告诉园丁:"要计算长方形的面积,只需将长度乘以宽度。于是,园丁算出玫瑰花地的面积是 50 平方米。现在园丁又开辟了一块玫瑰花地,形状也是规则的长方形,园丁通过上面的方法计算出玫瑰花地的面积。

输入:

一行,两个正整数a,b,中间用空格隔开,分别代表长方形的长和宽。(0<a,b<10000)

输出:

一行,一个正整数,代表玫瑰花地的面积。

样例1:

​ 输入:

​ 1 1

​ 输出:

​ 1

样例2:

​ 输入:

​ 10 5

​ 输出:

​ 50

AC代码:
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    int a,b;//a是长,b是宽 
    int main(){
    	cin>>a>>b;//输入长和宽 
    	cout<<a*b;//输出长方形的面积:长*宽 
    	return 0;
    } 
    
    
    cpp
    
    
【第二题】判断三角形
题目描述:

在一个小镇上,有一位名叫艾米的小女孩,她非常喜欢观察各种形状。一天,她在公园里发现了一块奇特的三角形玻璃。这块玻璃不仅外形完美,还能反射出七彩的光芒。艾米觉得这块玻璃一定有神秘的力量,于是她把它带回家仔细研究。几天后,艾米发现这块三角形玻璃可以用来聚焦阳光,点燃火柴。这个发现让她惊喜不已,也激发了她对科学的浓厚兴趣。

现在艾米想知道这块三角形玻璃的形状:
①如果三角形的三条边都相等,那么这个三角形是等边三角形;
②如果三角形中有两条边的长度相等,那么这个三角形是等腰三角形;
③如果三角形的一条边长的平方等于另外两条边长的平方和,那么这个三角形是直角三角形。

输入三角形的三边长度,判断该三角形是等腰三角形、直角三角形还是等边三角形。(输入数据保证能构成三角形)。

如果是等腰三角形,输出"Isosceles glass”;
如果是等边三角形,输出"Equilateral glass”
如果是直角三角形,输出"Right angle glass”
如果三者都不是,输出"None”。

输入:

输入只有一行,三个正整数,代表三角形的三条边长,之间用空格隔开。

输出:

输出只有一行,一个字符串。

样例1:

​ 输入:

​ 1001 1001 1

​ 输出:

​ Isosceles glass

样例2:

​ 输入:

​ 3 4 5

​ 输出:

​ Right angle glass

样例3:

​ 输入:

​ 5 7 8

​ 输出:

​ None

AC代码:
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    int a,b,c; //三条边的边长 
    int main(){
    	cin>>a>>b>>c;//输入三条边的边长 
    	if(a==b && b==c){//如果三条边都相等,输出等边三角形 
    		cout<<"Equilateral glass";
    	}else if(a==b || b==c || c==a){//如果只有两条边相等,输出等腰三角形 
    		cout<<"Isosceles glass";
    	}else if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){//如果一条边长的平方等于另外两条边长的平方和,输出直角三角形 
    		cout<<"Right angle glass";
    	}else{
    		cout<<"None";
    	}
    	return 0;
    } 
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/Uvkuf1jaNAGKEJWopCFxz96qgHQZ.png)
【第三题】汤姆的日记
题目描述:

小男孩汤姆在家里的旧柜子里发现了一本古老的日记。日记中记录了一个失落王国的秘密和一条通往宝藏的路径。好奇心驱使他按照日记的指引,找到了一扇隐藏在树林深处的石门。打开石门后,他进入了一个神秘的地下世界,里面充满了奇珍异宝。回到家后,汤姆把日记放回柜子,从此期待每一次新的探索与发现。小男孩汤姆家的柜子是一个长方体,由很多小柜子组成。汤姆一共有 n 次操作,分为两种类型:
【第一种类型】M i j k:汤姆往第 i行第 j列的柜子里存入日记,并在日记上面写下编号k。
【第二种类型】N i j:汤姆取出第 i 行第 j列柜子里的日记,输出日记的编号(保证取出的柜子里有日记)。

保证行数1<=i<= 1000, 列数1<=j<= 1000,编号1<=K<=10000。

输入:

输入一共 n+1 行:第一行只有一个整数 n,表示操作次数;接下来 n行,每行表示一次操作,M代表第一种类型,N代表第二种类型,具体操作如题目描述所示。

输出:

对于每次查询操作,输出答案,以换行符隔开。

样例1:

​ 输入:

​ 2

​ M 2 3 4

​ N 2 3

​ 输出:

​ 4

样例2:

​ 输入:

​ 4

​ M 3 1000 1101

​ M 1 1 1

​ N 3 1000

​ N 1 1

​ 输出:

​ 1101
​ 1

AC代码:
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    int n,a[1010][1010];
    int main(){
    	cin>>n;
    	while(n--){//n次操作 
    		char c;
    		int i,j,k;
    		cin>>c;//输入操作类型 
    		if(c=='M'){//操作类型1:M 
    			cin>>i>>j>>k;//输入三个参数:i、j、k 
    			a[i][j]=k;//记录编号 
    		}else{//操作类型2:N
    			cin>>i>>j;//输入两个参数i、j 
    			cout<<a[i][j]<<endl;//输出编号 
    		}
    	}
    	return 0;
    } 
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/XjM708AKkgdDPr3fhxYV5lQ1a96J.png)
【第四题】正方形的数量
题目描述:

在一个神奇的王国里,有一块n行m列的格子地板。每个格子都是一个正方形,里面藏着一个秘密。小男孩阿力得到了一张古老的地图,上面标注了这些格子的谜题和宝藏。每天放学后,阿力都会来到这片地板上解开一个新的谜题。有时是数学问题,有时是历史故事,还有时是自然现象。随着他不断探索,他不仅找到了许多宝藏,还学到了无数知识。最终,阿力成为了村里最聪明的小孩,而那片格子地板也成了他心中永远的冒险乐园。阿力想知道格子地板里包含多少个正方形,他需要想出一个高效的办法。

输入:

输入只有一行,两个整数n m,中间用空格隔开,代表格子地板大小为n行m列。保证 n和 m 均为不超过 100 的正整数。

输出:

输出只有一行,一个整数,代表格子地板里包含多少个正方形。

样例:

​ 输入:

​ 2 4

​ 输出:

​ 11

AC代码(方法1):
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    /*方法1:暴力枚举 
    画图:n行m列的格子,n+1行 m+1列的线条
    枚举图中的矩形的左上角顶点和右下角顶点,计算矩形的长和宽,并判断是否相等
    长和宽相等的矩形是正方形,统计+1 
    */ 
     
    long long n,m,cnt=0;
    int main(){
    	cin>>n>>m;
    	for(int i=0;i<n;i++){//枚举所有左上角顶点(i,j) 
    		for(int j=0;j<m;j++){
    			for(int k=i+1;k<=n;k++){//枚举所有右下角顶点(k,h) 
    				for(int h=j+1;h<=m;h++){
    					if((k-i)==(h-j)) cnt++;//矩形的长和宽相等,就是正方形 
    				}
    			}
    			
    		}
    	}
    	cout<<cnt;
    	return 0;
    } 
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/vWBxasFgModqDUV5YSAHk8rCI2Kz.png)
AC代码方法2:
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    /*方法2:数学思维 
    画图:n行m列的格子,n+1行 m+1列的线条
    枚举矩形的所有左上角顶点(i,j)
    以(i,j)为左上角顶点的正方形个数为:min(n-i,m-j) 
    */ 
     
    long long n,m,cnt=0;
    int main(){
    	cin>>n>>m;
    	for(int i=0;i<n;i++){//枚举所有左上角顶点(i,j) 
    		for(int j=0;j<m;j++){
    			cnt+=min(n-i,m-j);//累加以(i,j)为左上角顶点的正方形个数	
    		}
    	}
    	cout<<cnt;
    	return 0;
    } 
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/BhxP1ijXyaYOZM7rvm6KqD5WsGeJ.png)
【第五题】字符操作
题目描述:

从前有一个叫做小 A 的字符串,它住在编程世界的字符村。小 A 喜欢和其他字符交朋友,比如空格、逗号和字母B。有一天,小A遇到了一个神秘的函数,这个函数告诉它,只要加入更多的字符,就能变成更强大的字符串。于是,小A开始了冒险,结识了字符’1’、符号#,甚至还有换行符’\n’。最终,小A成为了一个长长的、有意义的句子,实现了自己的梦想。在这个过程中,小A明白了合作的重要性,也找到了自己在代码中的位置。小A在旅途中遇到了很多字符串 str,随着小A不断的结交朋友,它的长度也逐渐变长,具体有两种变长操作:
F str:前插入。表示在字符串小A前面插入字符串 str。
B str:后插入。表示在字符串小A后面插入字符串 str。
R:表示反转整个字符串。
规定字符串小A的初始模样和每次操作的 str 都不含空格或换行。
请你计算出字符串小A旅途结束后的模样。

输入:

输入共 n+2 行:
第一行,输入一个正整数 n,表示操作次数;
第二行,输入一个字符串 str,表示文档最开始的字符串;
从第三行开始,往下n行,每行表示一个操作。

保证操作次数 1<=n<=1000,字符串小A的初始长度和每次插入的字符串 str 的长度均不大于 100。

输出:

输出只有一行,一个字符串。

样例:

​ 输入:

​ 3

​ Tom

​ F ht

​ B ut

​ R

​ 输出:

​ tumoTth

AC代码:
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    //方法:按题意模拟 
    int n; 
    string str;
    int main(){
    	cin>>n;
    	cin>>str;
    	while(n--){
    		char c;
    		string str2;
    		cin>>c;
    		if(c=='F'){//操作类型1:str前插入 
    			cin>>str2;
    			str=str2+str; //将str拼接到str2后面 
    			//str.insert(0,str2);//也可以使用插入函数 
    		}else if(c=='B'){//操作类型2:str后插入
    			cin>>str2;
    			str+=str2;//将str2拼接到str后面
    		}else{//操作类型3:反转
    			reverse(str.begin(),str.end());//使用反转函数 
    		}
    	}
    	cout<<str;
    	return 0;
    } 
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/eGiSFmABbp19n2856r3DQTjhkuXt.png)
【第六题】猴子摘桃
题目描述:

花果山上有一只猴子,每天都去蟠桃园摘桃子。第一天,猴子只摘了一个桃子:之后两天(第二天和第三天),最子每天都摘两个桃子,之后三天(第四、五、六天),猴子每天都摘三个桃子,之后四天(第七、八、九、十天),猴子每天都四个桃子…这种模式会一直持续下去,因为蟠桃园里的桃子无穷无尽,请计算在前n天里,猴子一共摘了多少个挑子。

输入:

输入只有一行,一个正整数n,表示前n天。(1<=n<=1000)

输出:

输出只有一行,一个正整数,表示前n天猴子一共摘了多少个桃子。

样例:

​ 输入:

​ 6

​ 输出:

​ 14

AC代码:
复制代码
    #include<bits/stdc++.h>
    using namespace std;
    /*
    题目的需求为计算1+2+2+3+3+3+4+4+4+4+... 
    1加1次,2加2次,3加3次...数字i加i次
    没加1次算1个数,总共需要累加n个数
    */ 
    int n,cnt,sum; 
    int main(){
    	cin>>n;
    	for(int i=1;;i++){//枚举要加的数:1、2、3、4... 
    		for(int j=1;j<=i;j++){//数字i需要加i次 
    			sum+=i;
    			cnt++;//cnt用于统计已经加了几个数 
    			if(cnt==n){//当加够n个数时,输出答案并结束程序 
    				cout<<sum;
    				return 0;
    			}
    		}
    	}
    	return 0;
    } 
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/jsmA27UoMGDwtWd4JbgFk91YXZl8.png)

文末彩蛋:

关注并查看老师的个人主页,学习完整csp信奥赛完整系列课程: [**()
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~