A题:
请问在1900-2020中有多少个质数?
直接暴力筛就可以了,最后结果是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<bits/stdc++.h> 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<bits/stdc++.h> 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<bits/stdc++.h> 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<b<c;
思路:不知道时间规定,看样子是动态规划,但是我太菜了当时没想出来,暴力估计拿不到满分,三个循环解决。
#include<bits/stdc++.h> 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<bits/stdc++.h> 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; }
总结:
我认为省赛绝对没有这么水,大家不要被迷惑了,主要因为这场比赛不涉及任何算法,并且据说给的时间也挺多,所以暴力也是有可能满分的,给了一些基础不好的人极大的自信心
不是我 ,总之省一的话如果会这几道题就能拿,我觉得这个比赛也是蛮水的,最后,我的题解可能不是最优解或者有错误,望在评论区指正。