当前位置:   article > 正文

【比赛题解】2020蓝桥杯青少组省赛(中级组)部分题解_黑心药商蓝桥杯

黑心药商蓝桥杯

目录

前言

一、黑心商家

题目描述

样例输入

样例输出

题目解析

AC代码1(分类讨论)

AC代码2(简化版) 

二、调皮的猫咪

题目描述

样例输入

样例输出

题目解析

AC代码

三、字母频率统计

题目描述

样例输入

样例输出

题目解析

AC代码

四、选小寿星

题目描述

样例输入

样例输出

题目解析

AC代码

结束语

前言

        大家好,这一篇题解主要是关于2020那届蓝桥杯的题解。

一、黑心商家

题目描述

        黑心商家在网上出售糖果,根据糖果的重量额外计算邮费,计算规则:重量在 1000 克以内(包含 1000 克),邮费 8 元。超过 1000 克的部分,每 500 克加收超重费 4 元,不足 500 克部分按 500 克计算。现在我们知道每 100 克糖果 12元(限定只能购买 100 克的倍数)请你计算出顾客想要吃到糖果共需要的花费(糖果费用和邮费的总和)
        输入描述:输入一行,包含一个整数,表示糖果的重量,单位克
        输出描述:输出一行,包含一个整数,表示糖果的总花费

样例输入

1200

样例输出

156

题目解析

        这一篇文章比较简单,分类讨论是一种方法,也可以简化。

AC代码1(分类讨论)

  1. #include<iostream>//调用输入输出流头文件
  2. #include<cmath>//调用数学头文件
  3. using namespace std;//使用标准名字空间
  4. int main(){//主函数开始
  5. int w,ans;//定义整数类型变量w
  6. cin>>w;//输入w的值
  7. if(w<=1000){//如果w小于等于1000
  8. ans=w/100*12+8;//将ans赋值为w/100*12+8
  9. }else{//否则
  10. ans=w/100*12+8+ceil((w-1000)/500.0)*4;//将ans赋值为w/100*12+8+ceil((w-1000)/500.0)
  11. }
  12. cout<<ans<<endl;//输出ans的值并换行
  13. return 0;//主函数结束,返回0
  14. }

AC代码2(简化版) 

  1. #include<cstdio>//调用C语言输入输出头文件
  2. #include<algorithm>//调用算法头文件
  3. #include<cmath>//调用数学函数头文件
  4. using namespace std;//使用标准名字空间
  5. int wg,ct;//定义整数类型变量wg
  6. int main(){//主函数开始
  7. scanf("%d",&wg);//输入wq的值
  8. ct=(wg*12)/100+8+ceil(max(wg-1000,0)/500.0)*4;//将ct赋值为......
  9. printf("%d",ct);//格式化输出ct的值
  10. return 0;//主函数结束,返回0
  11. }

二、调皮的猫咪

题目描述

        皮皮的猫咪又一次越狱了,目标是远处的冰激凌商店,由于猫咪之前越狱已经积累了不少的经验,于是这次猫咪逃的更快了,如果皮皮想要寻找猫咪,相当于身处在一个地图中,地图上有一些部分可以正常通行,而另一些部分则不能通过。皮皮目前的位置在地图的左上角,他知道猫咪会逃到地图右下角的冰激凌商店。皮皮想要在路上截住猫咪。为了防止走冤枉路,皮皮的每一步只会向右或者向下行走。皮皮想知道,有多少条通往冰激凌商店的路径呢?
        输入描述:
        输入由 n+1 行组成;
        第一行,为两个整数 n 和 m(0<n<m<=20)
        第二行至第 n+1 行,每行有 m 个整数,第 i 行第 j 列的整数代表地图上的坐标为(i,j)的点是否可以通过,1 表示该点可以通过,0 表示该店不能通过(数据保证起点和终点是可以通过的)
        输出描述:输出一个正整数,代表皮皮走到冰激凌商店的可行路径数

样例输入

4 5
1 1 1 1 0
0 1 1 1 0
0 1 0 1 1
1 1 1 1 1

样例输出

7

题目解析

        这一道题的考点是标数法与递推算法,标数法即:
        1 1 1 1 0
        0 1 2 3 0
        0 1 0 3 3
        0 1 1 4 7
        这里是每一个点能被走到的方法数等于左边或上面的之和,因此,我们用算法模拟这个过程。

AC代码

  1. #include<iostream>//调用输入输出流头文件
  2. using namespace std;//使用标准名字空间
  3. int a[21][21],x;//定义数组a,包含21*21个整数类型变量,定义整数类型变量x
  4. int main(){//主函数开始
  5. a[1][0]=1;//将a的1*0号元素赋值为1
  6. int n,m;//定义整数类型变量n,m
  7. cin>>n>>m;//输入n,m的值
  8. for(int i=1;i<=n;i++)//for循环,计数器i从1自增到n,共循环n次
  9. for(int j=1;j<=m;j++){//for循环,计数器i从j自增到m,共循环次
  10. cin>>x;//输入x的值
  11. if(x) a[i][j]=a[i-1][j]+a[i][j-1];//如果x为真,将a的i,j号元素赋值为a的i-1,j号元素+a的i,j-1号元素
  12. }
  13. cout<<a[n][m]<<endl;//输出a的n,m号元素并换行
  14. return 0;//主函数结束,返回0
  15. }

三、字母频率统计

题目描述

        如果你得到一篇英文文章,你需要统计每个英文字母(不区分大小写)的出现次数,并按次数从高到低排序后展示(如果出现次数相同,则较靠前的字母在前)
        输入描述:
        输入共一行,是一篇英文文章,文章中仅可能出现空格、大小写英文字母及如下字符:’”.?;:-+=$/()
        输出描述:
        输出包含 26 行:
        每行格式为 I a: x,其中 i 为该输出行为第几行,a 为文章中出现次数第 i 多(如果出现次数相同,则字典序靠前的字母在前)的英文字母的大写形式,x 是其出现的次数,如在第二行中,字母 s 出现的次数第二多,出现了 10 次,则输出 2 S: 10

样例输入

Love Your Life(Henry David Thoreau) However mean your life is ,meet it and live it; do not shun it and call it hard names

样例输出

1 E: 12
2 I: 9
3 A: 8
4 N: 7
5 O: 7
6 T: 7
7 D:6
8 L: 6
9 R: 6
10 H: 5
11 U: 4
12 V: 4
13 M: 3
14 S: 3
15 Y: 3
16 F: 2
17 C: 1
18 W: 1
19 B: 0
20 G: 0
21 J: 0
22 K: 0
23 P: 0
24 Q: 0
25 X: 0
26 Z: 0

题目解析

        这道题非常简单,只需要识别字符串的各各元素即可。

AC代码

  1. #include<iostream>//调用输入输出流头文件
  2. #include<algorithm>//调用算法头文件
  3. #include<cstdio>//调用C语言输入输出头文件
  4. using namespace std;//使用标准名字空间
  5. int cnt[26];//定义数组cnt,包含26个整数类型变量
  6. int main(){//主函数开始
  7. string s;//定义字符串类型变量s
  8. getline(cin,s);//整行输入s的值
  9. for(int i=0;i<s.size();i++){//for循环,计数器i从0自增到s的长度减1,共循环s的长度次
  10. if('a'<=s[i] && s[i]<='z')//如果s的i号元素为小写字母
  11. cnt[s[i]-'a']++;//cnt的s的i号元素-a自增1
  12. if('A'<=s[i] && s[i]<='Z')//如果s的i号元素为大写字母
  13. cnt[s[i]-'A']++;//cnt的s的i号元素-A自增1
  14. }
  15. for(int i=1;i<=26;i++){//for循环,计数器i从1自增到26,共循环26次
  16. int big=max_element(cnt,cnt+26)-cnt;//定义整数类型变量big,并初始化赋值为最大值的编号
  17. printf("%d %c: %d\n",i,'A'+big,cnt[big]);//输出最大值的内容
  18. cnt[big]=-1;//将cnt的big号元素赋值为-1
  19. }
  20. return 0;//主函数结束,返回0
  21. }

四、选小寿星

题目描述

        班里共有 m 名同学,班主任将 m 名学生为围成一个圈,从 1 到 m 进行编号,然后挑选一个数字 n(1<n<9),从第一个同学开始,从 1 到 n 报数,报到 n 的同学就出局,然后下一位同学重新从 1 开始报数,留下的最后一名同学就是小寿星。由于女生少,班主任决定:每名女生第一次数到 n 不会立刻出局,第二次数到 n 时出局。 例如,m=4,其中有 1 名女生,编号顺序为 1,2,3,4,分别是男,女,男,男,n=2,第一轮报数,报到的是 2 号女生,暂不出局。第二轮报数,四号男生报 2 出局。第三轮报数,二号女生报 2 出局。第四轮报数,1 号男生报 2 出局,最后留下 3 号男生,输出 3。
        输入描述:
        第一行,一个正整数 m,表示班上的学生人数;
        第二行,m 个正整数 s1,s2,s3……sm,用空格分隔,si=1 表示编号 i 的学生是男生,si=0 表示编号为 i 的学生是女生;
        第三行,一个正整数 n,表示数到 n 的人出局(注意:女生有 2 次机会)
        输出描述:
        输出最后留下的学生的编号。

样例输入

5
1 0 0 1 1
3

样例输出

2

题目解析

        这道题是约瑟夫环的进阶版,这里就难以使用递归了,最好使用模拟。

        首先,设女生有两条命,男生有一条命,于是用循环结构来依次判断,将最后的人id%m+1输出。

AC代码

  1. #include<iostream>//调用输入输出流头文件
  2. using namespace std;//使用标准名字空间
  3. int life[10000];//定义数组life,包含10000个整数类型变量
  4. int main(){//主函数开始
  5. int m,n;//定义整数类型变量m,n
  6. cin>>m;//输入m的值
  7. for(int i=0;i<m;i++){//for循环,计数器i从0自增到m-1,共循环m次
  8. cin>>life[i];//输入life的i号元素
  9. life[i]=2-life[i];//将life的i号元素赋值为2-life的i号元素
  10. }
  11. cin>>n;//输入n的值
  12. int cnt=0,die=0,id=0;//定义整数类型变量cnt,die,id,并全部初始化赋值为0
  13. while(1){//装死循环
  14. if(life[id]) cnt++; //如果life的id号元素不为0,cnt自增1,即当前位置是活人, 报数
  15. if(cnt==n){ //如果cnt等于n,即已报数到 n
  16. life[id]--; //life的id号元素自减1,即扣1条命
  17. if(life[id]==0) die++; //如果life的id号元素等于0,即命减到 0, 死亡人数 +1
  18. cnt=0; //将cnt赋值为0,即重置
  19. }
  20. if(die==m) break; //如果die等于m,即最后一人, 跳出
  21. id=(id+1)%m;//将id赋值为id+1%m
  22. }
  23. cout<<id%m+1<<endl; //输出id%m+1的值
  24. return 0;//主函数结束,返回0
  25. }

结束语 

        那么本期题解就到此结束了,感谢大家的收看。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/64291
推荐阅读
相关标签
  

闽ICP备14008679号