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