第十一届蓝桥杯青少组省赛(中级组)详细题解

一、双面打印
题目描述
       在 2020 年这个漫长的寒假里,虽然小蓝和他的同学们都在家里,但依旧通过网课的方式坚持学习,而老师们也依旧会布置作业和发放各种电子版的学习资料。为了方便小蓝的学习,妈妈会把老师发放的材料打印出来。而为了环保﹐妈妈一般都进行双面打印,也就是一张纸的正反面都打印出相应的内容。举个例子来说:如果一份电子材料有 3 页,那么需要 2 张纸进行打印;如果一份电子材料有 4 页,那么还是需要 2 张纸进行打印。现在已经知道了一份电子版的学习材料的页数 N,你能帮小蓝计算一下需要几张纸吗?

       输入描述∶整数 N ( O≤N≤1000 ),代表一份电子版的学习材料的页数。
       输出描述∶双面打印所需纸的张数。

样例输入
7

样例输出
4

评分标准 
10 分:能正确输出一组数据;
20 分:能正确输出两组数据;
20 分:能正确输出三组数据。

题目解析 
       这道题很简单,输入需要打印的页数,可以用int形定义,输出打印页数/2+打印页数%2;也可以用double形定义,输出打印页数除以2并上去整。这里考的重点是数据类型的运用,因此我们需要特别注意。

AC代码1

#include<iostream>//调用输入输出流头文件
using namespace std;//使用标准名字空间
int N,ans;//定义整数类型变量N,ans,代表单面打印的页数和双面打印的页数
int main(){//主函数开始
    cin>>N;//输入N的值
    ans=N/2+N%2;//将ans赋值为N除以2加N模2
    cout<<ans;//输出ans的值
    return 0;//主函数结束,返回0
}


AC代码2 

#include<iostream>//调用输入输出流头文件
#include<cmath>//调用数学函数头文件
using namespace std;//使用标准名字空间
double N,ans;//定义浮点数类型变量N,ans,代表单面打印的页数和双面打印的页数
int main(){//主函数开始
    cin>>N;//输入N的值
    ans=ceil(N/2);//将ans赋值为N除以2上取整
    cout<<ans;//输出ans的值
    return 0;//主函数结束,返回0
}


二、求完数
题目描述
         因子∶因子也叫因数,例如 3*5=15,那么 3 和 5 是 15 的因子。同时 15*1=15,那么 1 和15 也是 15 的因子。1,3 ,5,15 这四个因子是 15 的所有因子。完数:如果一个数等于不含它本身的其他因子之和,则称该数为‘完数'。如 6 的因子有 1,2,3 ,6,且 1+2+3=6,因此 6 是完数。

         输入一个正整数 N(0<N<10000 ) ,输出小于 N 的所有完数及小于 N 的完数个数(个数前加“*”,例如:*2 ) 。

         输入描述:输入一个正整数 N(O<N<10000 )

         输出描述:输出小于 N 的所有完数及小于 N 的完数个数

样例输入 
100

样例输出 
6
28
*2

评分标准 
20 分:能正确输出一组数据;
10 分:能正确输出两组数据;
20 分:能正确输出三组数据;
20 分:能正确输出四组数据。

题目解析 
       这里用一个函数y来记录判断一个数是否是完数的过程,其中,第一个for循环是为了找到形参n除自己外的所有因数,保存在数组re里,并使用一个变量com_来记录re的下一个操作相应元素号。

       接着,将re的所有储存了变量元素都统计在ans里,判断得出结果。

       这样,在main里面就很简单了,声明一下函数(其实可以省略),在for循环带入,这一道题算是解出来了。但注意题目要求最后输出*数量,用printf语句就行。

AC代码 

#include<iostream>//调用输入输出流头文件 
#include<cstdio>//调用C语言标准输入输出流头文件 
using namespace std;//使用标准名字空间 
bool y(int n){//定义函数y,参数n为整数类型,返回值为布尔类型 
    int re[1009],com_=0,ans=0;//定义数组re,包含1009个整数类型变量,定义整数类型变量com_.ans并初始化赋值为0 
    for(int i=1;i<n;i++){//for循环,计数器i从1自增到n-1,共循环n-1次 
        if(n%i==0){//如果n能被i整除 
            re[com_]=i;//将re的com_号元素赋值为i 
            com_++;//com_自增1 
        } 
    }for(int i=0;i<com_;i++){//for循环,计数器i从0自增到com_-1,共循环com_次 
        ans+=re[i];//ans自增re的i号元素 
    }if(ans==n){//如果ans等于n 
        return true;//返回真 
    }return false;//返回假 
}
int main(){//主函数开始 
    bool y(int n);//声明函数y,参数n为整数类型,返回值为布尔类型  
    int n,ans=0;//定义整数类型变量n,ans并初始化赋值为0 
    cin>>n;//输入n的值 
    for(int i=1;i<n;i++){//for循环,计数器i从1自增到n-1,共循环n-1次 
        if(y(i)){//如果y(i)为真 
            ans++;//ans自增1 
            cout<<i<<endl;//输出i的值 
        } 
    }printf("*%d",ans);//格式化输出*ans 
    return 0;//主函数结束,返回0 
}

三、求阴影面积
题目描述
        用户输入一个正整数 a (0<a<100 ) ,作为如图半圆的直径,同时作为如图等腰直角三角形的直角边长度,求下图的阴影部分面积,如下所示∶

        提示信息:
        三角形面积公式:S=(ah)/2(公式中 a 为三角形的底边, h 为底边所对应的
高) 圆形面积公式:S=πr2(公式中 r 为圆的半径,π= 3.14 )

        已知条件:
半圆的直径和等腰直角三角形直角边长度相同;三角形与半圆部分重叠;

样例输入
10

样例输出
25.00

评分标准
20 分∶能正确输出一组数据﹔
20 分∶能正确输出两组数据﹔
20 分∶能正确输出三组数据;
20 分︰能正确输出四组数据。

题目解析
       这道题比较水,将两块阴影部分拼起来,得到一个三角形,面积为a*a/4,此处不多讲解,上代码。

        其中的setiosflags(ios::fixed)<<setprecision(2)是fixed<<setprecision(2)的全称,没有什么大的区别,但更推荐前者。

AC代码 

#include<iostream>//调用输入输出流头文件 
#include<iomanip>//调用输入输出控制流头文件 
using namespace std;//使用标准名字空间 
double a,S;//定义浮点数类型变量a,S 
int main(){//主函数开始 
    cin>>a;//输入a的值 
    S=a*a/4;//将S赋值为a的平方除以4 
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<S;//输出S的值,保留两位小数 
    return 0;//主函数结束,返回0 
}


四、选择题判定
题目描述
        受疫情的影响,2020 年蓝桥杯大赛青少年创意编程 C++组的省赛在网上进行。选择题有 5道﹐都是单选题,每道 30 分,共计 150 分。每道选择题选对得 30 分,选错或者不选得 0分。
        注意以下仅为假设,不代表本场考试选择题的真实答案,仅是针对本编程题假设出的答案。 假设正确的答案为“DCBAD”,那么你能根据选手的提交情况﹐判定选手的选择题总分吗﹖选手提交一个由 5 个字符组成的字符串﹐代表选手的选项。字符串仅能包含如下 5 种字符:“D"、 “C"、“B"、“A"、“E”。其中“A”、“B”、“C"、“D”代表选手选择了某个选项,而“E"代表选手未做该题。

样例输入
DCEAA

样例解释 
见下表。

正确答案

D

C

B

A

D

选手提交

D

C

E

A

A

      分值

30

30

0

30

0

总分:90

样例输出
90

评分标准
20 分:能正确输出一组数据﹔
20 分:能正确输出两组数据﹔
20 分:能正确输出三组数据﹔
20 分:能正确输出四组数据。

题目解析
    这道题解起来比较容易,字符串逐个比较位,用ans统计即可

AC代码

#include<iostream>//调用输入输出流头文件 
using namespace std;//使用标准名字空间 
string st_="DCBAD";//定义字符串st_并初始化赋值为DCBAD 
string my_;//定义字符串my_ 
int ans;//定义整数类型变量ans 
int main(){//主函数开始 
    getline(cin,my_);//整行输入字符串my_的值 
    for(int i=0;i<5;i++){//for循环,计数器i从0自增到4,共循环5次 
        if(st_[i]==my_[i]){//如果st_的i号元素等于my_的i号元素 
            ans+=30;//ans自增30 
        }
    }cout<<ans;//输出ans的值 
    return 0;//主函数结束,返回0 
} 


五、节气
题目描述
       夏至将至。《中国天文年历》显示,北京时间 6 月 21 日,也就是明天,夏至伴随着接天莲叶的碧,和映日荷花的红﹐即将盛装登场。夏至是中国"“二十四节气”的第十个节气, “二十四节气"被列入联合国教科文组织人类非物质文化遗产名录。在国际气象界,这一已有千年历史的时间认知体系被誉为“中国第五大发明”。

       春雨惊春清谷天,夏满芒夏暑相连。秋处露秋寒霜降,冬雪雪冬小大寒。二十四节气,在四季轮回流淌,每个节气都有它较为稳定的日子。下表给出了农历庚子年 (2020 年 1 月 25 日~2021 年 2 月 11 日)中,二十四个节气的名称,公历具体日期及汉语拼音的缩写。

立 春LC

2.4

雨水YS

2.19

惊蛰JZ

3.5

春 分CF

3.20

清 明QM

4.4

谷 雨GY

4.19

立 夏LX

5.5

小满XM

5.20

芒种MZ

6.5

夏 至XZ

6.21

小 暑XS

7.6

大 暑DS

7.22

立 秋LQ

8.7

处暑CS

8.22

白露BL

9.7

秋 分QF

9.22

寒 露HL

10.8

霜 降SJ

10.23

立 冬LD

11.7

小雪XX

11.22

大雪DX

12.7

冬 至DZ

12.21

小 寒XH

1.5

大 寒DH

1.20

       输入描述∶整数 M , N ( 2<M≤12, 1<N≤31 ) ,M ,N 分别代表公历 2020 年的某月,某日。再给出的数据均为合法日期。
       输出描述:此日期之后的即将到来或者此日期所在节气的汉语拼音缩写。

样例输入
5 21

样例输出
MZ
评分标准
20 分∶能正确输出一组数据﹔
20 分∶能正确输出两组数据﹔
20 分∶能正确输出三组数据﹔
20 分∶能正确输出四组数据。

题目解析1
       这道题是这届比赛的一道压轴题,主要的难点就是逻辑问题,你有可能很快就被他绕晕了,但仔细思考,这题也不是太难。这道题就靠你的思维能力。

        代码如下,先通过定义数组,来储存关于节气的数据,等于是构造了一个数据库,然后先考虑输入日期正好是某一个节气(等于)的情况,接着讨论12月份的特例,最后讨论一般情况。

        CSDN上关于本题的代码有很多,但基本都是错的,输入“5 21”(上面的样例输入)就挂了。

AC代码1

#include<iostream>//调用输入输出流头文件 
#include<string>//调用字符串头文件 
using namespace std;
int x,y,month[24]={1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12},day[24]={5,20,4,19,5,20,4,19,5,20,5,21,6,22,7,22,7,22,8,23,7,22,7,21};//定义整数类型变量x,y,数组month和day 
string jq[24]={"XH","DH","LC","YS","JZ","CF","QM","GY","LX","XM","MZ","XZ","XS","DS","LQ","CS","BL","QF","HL","SJ","LD","XX","DX","DZ"};//定义数组jq,包含24个字符串 
int main()//主函数开始 
{
    cin>>x>>y;//输入x,y的值 
    for (int i=0;i<24;i++)//for循环,计数器i从0自增到23,共循环24次 
        if (month[i]==x&&day[i]==y)//如果x,y与相应的数组元素相匹配 
        {
            cout<<jq[i];//输出jq的i号元素 
            return 0;//主函数结束,返回0 
        }
    for (int i=0;i<24;i++)//for循环,计数器i从0自增到23,共循环24次 
    {
        if (x==12&&y>day[23])//如果x等于12并且y大于day的23号元素,即十二月份时(特殊处理) 
        {
            cout<<jq[0];//输出jq的0号元素 
            return 0;//主函数结束,返回0 
        }
        else if (x>month[i]) continue;//当x大于month的i号元素,即时间没到时,跳出循环 
        else if ((x==month[i]&&y<day[i])||(x<month[i]))//当x与month的i号元素相等且y小于day的i号元素或x小于month的i号元素时 
        {
            cout<<jq[i];//输出jq的i号元素,查找成功 
            return 0;//主函数结束,返回0 
        }   
    }
    return 0;//主函数结束,返回0(此语句可省,但在各类作业平台提交时一般需要保留) 
}

题目解析2
        这一个做法在代码的简洁度与时间复杂度上都是一个特别不错的选择,但是他的思路比较复杂,我们来了解一下吧:

        首先,我们发现,在每一月都有三个不同的节气部分:
        _______*节点1*_______*节点2*________

        那么,我们只需要一些数组来记录,比如JQ1,来记录每月第一个节点的代号,JQ2,来记录每月第二个节点的代号;而数组jd1,jd2则是节点的具体数字。

        大家仔细看了,有可能会发现有一个奇怪的地方:“诶?为什么JQ1,JQ2,jd1,jd2前面都有一个空值或0?”那是因为,如果按照数组元素的0开始,后面就必须写成month-1,那么程序的可读性就下降了,我们要养成好习惯,这也是为了我们不会搞错。

        但是,还有一个问题:“JQ1,JQ2后面为什么还会出现一遍前面第1个?”那是因为,要防止跨年,因此就有了所谓的“第十三月”,其实代表一月份。

        好了,大家看看,理解一下。

AC代码2 

#include<iostream>//调用输入输出流头文件
#include<string>//调用字符串头文件
using namespace std;//使用标准名字空间
int main() {//主函数开始
    string JQ1[14]={"","XH","LC","JZ","QM","LX","MZ","XS","LQ","BL","HL","LD","DX","XH"},//定义字符串数组,分别存储每个月的前一个节气和后一个节气 
    JQ2[14]={"","DH","YS","CF","GY","XM","XZ","DS","CS","QF","SJ","XX","DZ","DH"};//防止跨年,定义13月的节气即1月的节气 
    int jd1[13]={0,5,4,5,4,5,5,6,7,7,8,7,7},jd2[13]={0,20,19,20,19,20,21,22,22,22,23,22,21};//定义数组分别存储每月的两个节点 
    int month,day;
    cin>>month>>day;
    if(day<=jd1[month]) cout<<JQ1[month];//日在该月第一个节点前(含),则为该月前一节气 
    else if(day>jd1[month]&&day<=jd2[month]) cout<<JQ2[month];//日在该月第一个节气后(不含),第二个节点前(含),则为该月第二个节气 
    else cout<<JQ1[month+1];//日在该月第二个节气后(不含),则为下月第一个节气 
    return 0;
}


六、垃圾分类
题目描述
       不知北京的小同学们会不会扔垃圾啊?
       2019 年 7 月 1 日,上海正式实施垃圾分类。
       2020 年 5 月 1 日,北京正式实施垃圾分类。
       不要以为垃圾分类这件事离自己很远,到 2020 年底,全国将有 46 个重点城市要基本建成垃圾分类处理系统。小伙伴们,你们准备好了吗?我们就以《北京市生活垃圾分类管理条例》为参考,学习一下垃圾分类的知识吧。
       生活垃圾基本分类有四种∶厨余垃圾,可回收物,有害垃圾和其他垃圾。
       ①"厨余垃圾"指家庭中产生的菜帮菜叶、瓜果皮核、剩菜剩饭、废弃食物等易腐垃圾。           ②"可回收物"指在日常生活中己失去原有使用价值,但回收后加工可再利用的垃圾;
       ③"有害垃圾"指生活垃圾中的有毒有害物质;
       ④"其他垃圾"指除上述垃圾之外的生活垃圾,及难辨识类别的生活垃圾。

       下表中列举了四类垃圾中的三个常见例子,及其英文标识。

1.厨余垃圾(FOOD WASTE):菜叶(leaves),西瓜皮(watermelon peel),剩饭(leftovers).
2.可回收物(RECYCLABLE):纸箱(paper box),塑料瓶(plastic bottle),衣服(clothes).
3.有害垃圾(HAZARDOUS):充电电池(rechargeable battery),弃置药品(abandoned medicine),消毒剂(disinfectant)
4.其他垃圾(RESIDUAL WASTE):口罩(mask),普通电池(battery),塑料袋(plastic bag).

       学会了吗?现在请你根据输入的(1-20)个垃圾名称,将这些垃圾进行归类统计,并将出现次数最多的垃圾种类的英文名称,及其出现次数打印出来。
       输入描述:
       第一行为一个正整数 N(1≤N≤20),代表接下来将出现的垃圾行数。接下来 N 行,每行是上表中某一种具体的垃圾的英文名称。
       (注意:测试数据中,出现次数最多的垃圾种类只有一种)

       输出描述:
       输出结果有 2 行。
       第一行是出现次数最多的垃圾种类的英文名称。第二行是出现次数最多的垃圾种类的出现次数。

样例输入
5
leaves
mask
disinfectant
leftovers
watermelon peel

样例输出
FOOD WASTE
3

评分标准
20 分∶能正确输出一组数据﹔

20 分∶能正确输出两组数据﹔

20 分∶能正确输出三组数据﹔

30 分∶能正确输出四组数据。

题目解析
       这道题相比上一题来说,在思路上简单很多。但这题的重点在字符串数组的操作上。

       其中,最重要的一条代码,也是本届最“高级”的一串代码,就是char ch=cin.get();,这个代码的作用是接收换行的Enter,有些人用getchar(),本地Dev上编译没错,但一般在答题系统上一般会出错,因为系统有要求。

       再来谈谈这道题的解题思路。首先,用一个二维字符串数组记录垃圾的分类和具体名称,然后再用整数类型数组each来记录每一种垃圾的数量。最后求最大值,得出结论。大家看看代码,思考一下。

AC代码

#include<iostream>//调用输入输出流头文件
#include<string>//调用字符串头文件 
using namespace std;//使用标准名字空间 
string rub[4][4]={{"FOOD WASTE","leaves","watermelon peel","leftovers"},
                {"RECYCLABLE","paper box","plastic bottle","clothes"},
                {"HAZARDOUS","rechargeable battery","abandoned medicine","disinfectant"},
                {"RESIDUAL WASTE","mask","battery","plastic bag"}};//定义二维数组rub,代表各种垃圾及分类 
string myrub[20];//定义数组myrub,包含20个字符串类型变量 
int each[4];//定义数组each,包含4个整数类型变量 
int n,n_max=0;//定义整数类型n,n_max并初始化赋值为0 
int main(){//主函数开始 
    cin>>n;//输入n的值 
    char ch=cin.get();//这里需要一个来接收enter,不然这个回车键就是myrub[0]的内容
    for(int i=0;i<n;i++){//for循环,计数器i从0自增到n-1,共循环n次 
        getline(cin,myrub[i]);//整行输入myrub的i号元素 
    }
    for(int i=0;i<n;i++){//for循环,计数器i从0自增到n-1,共循环n次 
        for(int j=0;j<4;j++){//for循环,计数器j从0自增到3,共循环4次 
            if(myrub[i]==rub[j][1]||myrub[i]==rub[j][2]||myrub[i]==rub[j][3]){//如果murub的i号元素等于rub的[j]1,2,3号元素 
                each[j]++;//each的j号元素自增1 
            }
        }
    }
    for(int i=1;i<4;i++){//for循环,计数器i从1自增到3,共循环3次 
        if(each[i]>each[n_max]){//如果each的i号元素大于each的n_max号元素 
            n_max=i;//将n_max赋值为i 
        }
    }
    cout<<rub[n_max][0]<<'\n'<<each[n_max];//输出rub的n_max,0号元素,换行并输出each的n_max 
    return 0;//主函数结束,返回0 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值