2020蓝桥杯省赛B组部分题解
A题 门牌制作
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、 0、 1、 7,即需要 1 个
字符 0, 2 个字符 1, 1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2 ?
【解题思路】
一道简单题。模拟1~2020,用四个字母记录每位上的数字,如果是2,sum++即可。
【代码实现】
#include <iostream>
using namespace std;
int main(){
int g,s,b,q,sum=0;
for (int i=1; i<=2020; i++) {
g=i%10;
s=(i/10)%10;
b=(i/100)%10;
q=(i/1000)%10;
if (g==2) {
sum++;
}
if (s==2) {
sum++;
}
if (b==2) {
sum++;
}
if (q==2) {
sum++;
}
}
cout<<sum<<endl;
}
答案:624。
B题 既约分数
【问题描述】
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4 , 5/2 , 1/8 , 7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1 到2020 之间的整数(包括1和2020)?
【解题思路】
写一个子函数计算两个数的公约数,如果找到大于1的公约数,则return false。主函数用两个for循环遍历所有分子分母的可能(注意:分子可以大于分母
【代码实现】
#include<iostream>
using namespace std;
int minn(int x,int y){
if(x>y){
return y;
}else{
return x;
}
}
bool gongyueshu(int x,int y){
if(x==1||y==1){
return true;
}
for(int i=2;i<=minn(x,y);i++){
if(x%i==0&&y%i==0){
return false;
}
}
return true;
}
int main(){
int i,j;
int num=0;
for(i=1;i<=2020;i++){
for(j=1;j<=2020;j++){
if(gongyueshu(i,j)){
num++;
}
}
}
cout<<num<<endl;
}
答案:2481215。
C题 蛇形填数
【问题描述】
如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?
【解题思路】
可以写代码模拟过程。更简单的方法是利用填数规则找规律,对于第n行n列的数x,x一定在第2n-1斜列(第1斜列有一个数为1,第2斜列有两个数为2、3,… ,第n斜列有n个数),
那么先计算前2n-2斜列一共有多少数(等差数列求和),
再加上x所在斜列前面有多少数(观察可知,数字5在第3斜列的第2个,数字13在第5斜列的第3个,… ,数字x在第2n-1斜列的第n个)。
答案:761。
D题 跑步锻炼
【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【解题思路】
显然可以用代码从2000-01-01模拟至2020-10-01,需要注意闰年的判断。
但对于这种日期题,最好的方法是excel,如下图。
利用excel的日期相减功能,计算出期间有多少天,从而计算出有多少个星期一。
再利用excel筛选功能,找出有多少个1号的周一,从而便能计算出结果。
答案:8879。
E题 七段码
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二极管,分别标记为a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
【解题思路】
拿到题时,第一反应是深度优先搜索(dfs)。深搜大部分是用在树型数据,而此题是一道图论。无论搜索哪个,深搜的最深点一定是7个灯全点亮。所以这就衍生出如何去重这一问题。
答主所采用的去重方法是:先把a~g用1-7表示。对于每次深搜的结果,例如abgcd点亮,其所对应的数字为12347(数字升序排序),若ans[12347]=0则ans[12347]=1,且sum++。
【代码实现】
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int book[8]