第十二届蓝桥杯C/C++省赛模拟(第四期)

A题:
请问在1900-2020中有多少个质数?
第十二届蓝桥杯C/C++省赛模拟(第四期)_第1张图片
直接暴力筛就可以了,最后结果是16个。

B题
ask表中80对应的字母:P

C题
前一百个斐波那契数列中,有多少是3的倍数?
25

D题
一棵二叉树有2021个叶子节点,那么这个树至少有多少个节点?
应该是4041
E题
求身份证号最后一位,通过对每一位的位权与数值相乘得前17位数字的总和位213,加上8最后就等于223,膜11刚好等于1
最后答案为8

F题
小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。他发现孩子们对于摩尔.斯电码非常感兴趣。

摩尔斯电码由两种基本的信号组成:短信号“滴"(用字符:表示)以及长信号"嗒"(用字符-表示)。下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:

为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:

你能写一个程序帮助小Hi吗?

没有思路,就是简单的字符模拟,打个表输出一下就好了。

#include
using namespace std;
int n;
string a[105];
string b[10]={"-----",".----","..---","...--","....-",
              ".....","-....","--...","---..","----."};
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<9;j++){
			int x=a[i][j]-'0';
			cout<<b[x]<<" ";
		}
		cout<<endl;
	}
	return 0;
} 

G题
输入一串字符,将首字母大写,后续字母小写。
思路:无思路,简单的判断而已

#include
using namespace std;
string a;
int main(){
	cin>>a;
	if(a[0]>='a'&&a[0]<='z')a[0]-=32;  //先把首字母处理了
	for(int i=1;i<=a.length();i++){ //再处理后续字母
	    if(a[i]>='A'&&a[i]<='Z')a[i]+=32;
	}
	cout<<a; //输出字符串即可
	return 0;
}

H题
小蓝在商店买文具。
一只钢笔x元,小蓝买了a只
一个笔记本y元,小蓝买了b个
请问小蓝一共需要支付多少钱

小学二年级数学题,两行代码搞定

#include
using namespace std;
int x,a,y,b;
int main(){
	cin>>x>>a>>y>>b;
	cout<<x*a+y*b;
	return 0;
}

I题
递增三元组,给定一个序列,找出他有多少个3个数的子序列满足a 思路:不知道时间规定,看样子是动态规划,但是我太菜了当时没想出来,暴力估计拿不到满分,三个循环解决。

#include
using namespace std;
long long n;
long long a[100005];
long long cnt; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n-1;i++){
		for(int j=i+1;j<=n-1;j++){
			    if(a[i]<a[j]){		
			    for(int k=j+1;k<=n;k++){
				if(a[j]<a[k])cnt++;
			    }
			}
		}
	}
	cout<<cnt;
	return 0;
}

J题
J题详细的记不清了,但是问题大概就是给出一个序列,比如{1,2,3,4,5,6,7},这个序列中的前两位和后两位不进行计算,从第3位开始,他的输出是在范围i-2~i+2这五个数字中的最大值和最小值的差,比如上面这个序列,位置为3的数字,他的输出就是最大值5减去最小值1,那么他的输出就是4,一个长度为N的序列一共要输出n-4个数字,上面这个样例的输出就是4 4 4

我直接暴力做了,总体难度等于没有难度,最难的我觉得是那道二叉树,因为我做不出来~

#include
using namespace std;
long long n,max1=0,min1=1000007;
long long a[1005];
long long f[1005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int cnt=1;
	for(int i=3;i<=n-2;i++){
		max1=0,min1=1000007; //最大值和最小值赋初值
		for(int j=-2;j<=2;j++){
			max1=max(a[i+j],max1); //每个循环取位置i范围内的最大值和最小值
			min1=min(a[i+j],min1);
		}
		f[cnt++]=max1-min1; //将他们的差记录在案!
	}
	for(int i=1;i<cnt;i++){
		cout<<f[i]<<" "; //输出即可。
	}
	return 0;
}

总结:
我认为省赛绝对没有这么水,大家不要被迷惑了,主要因为这场比赛不涉及任何算法,并且据说给的时间也挺多,所以暴力也是有可能满分的,给了一些基础不好的人极大的自信心不是我 ,总之省一的话如果会这几道题就能拿,我觉得这个比赛也是蛮水的,最后,我的题解可能不是最优解或者有错误,望在评论区指正。

你可能感兴趣的:(蓝桥杯C/C++历届试题)