【蓝桥备赛冲刺】2019年第十届蓝桥B组省赛题解C/C++陆续更新ing
目录
A题:组队
B题:年号字串
C题:数列求值
D题:数的分解
E题:迷宫
A题:组队
问题描述
作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?
思路分析
直接算就行了,好像不怎么需要代码。hh。不过算的话也有技巧。一号位找最高的前两个,二号位找最高的前两个,按照这样的找法。最后如果有多种情况,比较一下大小即可。
97(1号)+99(20号)+99(17号)+97(15号)+98(18/12号)=490
题目代码
没有代码。hh
题目答案
490
B题:年号字串
问题描述
小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27以上的数字小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对应329。请问2019 对应的字符串是什么?
思路分析
好像也不怎么需要代码,hh。一个26进制转换的题目。不过需要注意的是z对应26,我们计算的时候如果是26肯定是要进位的。这是一个实际与进制转换的细节区别。也可以选择手算。可能还比较快一些。
题目代码
#include using namespace std;int main(){int x=2019;while(x){int t=x%26;cout<<t<<' ';x/=26;}//输出的数字:17 25 2 //将转换后得到的数字按照题目转换成字母就行 //要注意的是输出的是倒着表达的return 0;}
题目答案
BYQ
C题:数列求值
问题描述
给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。求第20190324 项的最后4 位数字。
思路分析
一个跟斐波那契数列非常相似的题目。这里我将采取两种方法实现。一种比较直观,一种比较巧妙
题目代码(暴力模拟)
#include //直观思路 using namespace std;const int N=20200000,mod=10000;int f[N];int main(){int n=20190324;f[1]=1,f[2]=1,f[3]=1;for(int i=4;i<=n;i++)f[i]=(f[i-1]+f[i-2]+f[i-3])%mod;cout<<f[n];return 0;}
题目代码(滚动数组)
#include //滚动数组 using namespace std;const int mod=10000;int main(){int n=20190324;int f1=1,f2=1,f3=1,f4;for(int i=1;i<=n-3;i++){f4=(f1+f2+f3)%mod;f1=f2,f2=f3,f3=f4;}cout<<f4;return 0;}
题目答案
4659
D题:数的分解
问题描述
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。
思路分析
暴力模拟,不过有一些巧妙的技巧
题目代码
#include using namespace std;bool check(int x)//判断是否合法 {while(x){int t=x%10;if(t==2|t==4) return false;x/=10;}return true;}int main(){int res=0;int n=2019;for(int i=1;i<n;i++)if(check(i)){//巧妙的控制了三个变量的大小关系,避免了重复for(int j=i+1;j<n-i-j;j++) {int k=n-i-j;if(check(j)&&check(k))res++;}}cout<<res;return 0;}
题目答案
40785
E题:迷宫
问题描述
下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可以通行的地方。010000000100001001110000迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共10 步。其中D、U、L、R 分别表示向下、向上、向左、向右走。对于下面这个更复杂的迷宫(30 行50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。请注意在字典序中D<L<R<U。
思路分析
典型的BFS问题,不过有很多需要处理的细节。比如按照最小字典序输出,还有答案要的不是最短路径,也不是行走的路径坐标,而是方向。这是比较有趣的一个地方
题目代码
#include using namespace std;const int N=100;typedef pair PII;char g[N][N];int d[N][N];PII pre[100][100];int ne[5][3]={{1,0},{0,-1},{0,1},{-1,0}};int n,m;vector road;char check(PII a,PII b)//通过两坐标间偏移量转换成方向 {int dx=b.first-a.first;int dy=b.second-a.second;if(dx==1) return 'D';//向下 else if(dy==-1) return 'L';//向左 else if(dy==1) return 'R';//向右 else if(dx==-1) return 'U';//向上 }int bfs(){queue q;q.push({0,0});memset(d,-1,sizeof d);d[0][0]=0;while(q.size()){auto t=q.front();q.pop();for(int k=0;k=0&&x=0&&y<m&&g[x][y]=='0'&&d[x][y]==-1){d[x][y]=d[t.first][t.second]+1;pre[x][y]=t;q.push({x,y});}}}int x=n-1,y=m-1;while(x||y){road.push_back({x,y});auto t=pre[x][y];x=t.first,y=t.second;}return d[n-1][m-1];}int main(){n=30,m=50;for(int i=0;i<n;i++)for(int j=0;j>g[i][j];cout<<bfs()<<endl;road.push_back({0,0});reverse(road.begin(),road.end());for(int i=0;i<road.size()-1;i++)printf("%c",check(road[i],road[i+1]));return 0;}
输入数据
010101010010110010010101100101101001000010001010100000100010000010101001000010000000100110011010010101111011010010001000001101001011100011000000010000010000000010101000110100001010000010101010110010110001111100000010100001001010001010000010110000000011001000110101000010101100011010011010101011110111000110110101010010010010100000010001010011100000001010000010100010011010101011111001100001000011101000111000001010100001100010000001000101001100001001110001101000011100100010010101010101010100011010000001000010010000010100101010111010001010101000010111100100101001001000010000010101010100100100010100000000100000001010110011110100011000001010101000111010101001110000100001100001011001111011010000100010101010100001101010100101000010100000111011101001100000001011000100001011001011010010111000000001001010100100000001010010000100010000010001111010100100101001010101101001010100011010101101110000110101110010100001000011000000101001010000010001110000100000100011000011010110100000010010100100100001110110100101000101000000001110110010110101101010100001001010000100001101010100001000100010010001000101011010000100011001000100001010100101010101111101001000000100101000000110010100101001000001000000000010110100000010011101110010010000111010010110111010000000011010001000100010000000100001110100000011001110101000101000100010001111100010101001010000001000100000101001010010101100000001001010100010111010000011110000100001000000011011100000000100000000101110000001100111010111010001000110111010101101111000
题目答案(186个字符)
DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
此题如果不是很理解,可以参考博主这篇针对BFS的博客
传送门-[基于朴素的BFS,增加路径记载与方向记录的功能_嘟嘟嘟11的博客-CSDN博客]