2020年B组第二场真题

Posted 揭航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020年B组第二场真题相关的知识,希望对你有一定的参考价值。

2020年B组第二场真题

A_门牌制作

【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

624

提取每一位即可

#include <iostream>
#include <cstdio>

using namespace std;

int ans;

void get_cnt(int num) {
    while (num > 0) {
        int n = num % 10;
        if (n == 2) {
            ans++;
        }
        num /= 10;
    }
}

int main() {
    for (int i = 1; i <= 2020; ++i) {
        get_cnt(i);
    }
    cout << ans;
    return 0;
}

Python暴力。。。

print(sum(1 for i in ''.join(str(j) for j in range(1, 2021)) if i == '2'))

B 寻找 2020

本题总分:5 分

问题描述

小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找
到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:


同一行里面连续四个字符从左到右构成 2020。
同一列里面连续四个字符从上到下构成 2020。
在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:

220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个
是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一
个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。



这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
 
using namespace std;

char a[1000][1000];

int res = 0;

int main() {
	for (int i = 0; i < 300; ++i) {
		scanf("%s", a[i]);
	}
	
	for (int i = 0; i < 300; ++i) {
		for (int j = 0; j < 300; ++j) {
			if (a[i][j] == '2' && a[i + 1][j] == '0' && a[i + 2][j] == '2' && a[i + 3][j] == '0') {
				++res;
			}
			if (a[i][j] == '2' && a[i][j + 1] == '0' && a[i][j + 2] == '2' && a[i][j + 3] == '0') {
				++res;
			}
			// 从左上到右下 
			if (a[i][j] == '2' && a[i + 1][j + 1] == '0' && a[i + 2][j + 2] == '2' && a[i + 3][j + 3] == '0') {
				++res;
			}
		}
	}
	printf("%d", res);
	return 0;
}

B_既约分数

【问题描述】
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如,3/4 5/2 1/8 7/1
都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1
和 2020)?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

2481215

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int ans;

int main() {
    for (int i = 1; i <= 2020; ++i) {
        for (int j = 1; j <= 2020; ++j) {
            if (__gcd(i, j) == 1) {
                ans++;
            }
        }
    }    
    cout << ans;
    return 0;
}
from math import gcd
# 方法1 推导式
ans = sum(1 for i in range(1, 2021) for j in range(1, 2021) if gcd(i, j) == 1)
print(ans)

# 方法2
ans = 0
for i in range(1, 2021):
    for j in range(1, 2021):
        if gcd(i, j) == 1:
            ans = ans + 1
print(ans)

C_蛇形填数

【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
        1 2 6 7 15 ...
        3 5 8 14 ...
        4 9 13 ...
        10 12 ...
        11 ...
        ...

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
  • cpp
#include <stdio.h>
#include <iostream>

using namespace std;

int a[100][100];
int cnt = 1;
int main() {
    int x, y;
    for(int i = 1 ; i <= 40; i++) {
        if(i % 2 == 1) {
            for(x = i, y = 1; x >= 1 && y <= i; x--, y++) {
                a[x][y] = cnt++;
            }
        } else {
            for(int x = 1, y = i; x <= i && y >= 1; x++, y--) {
                a[x][y] = cnt++;
            }
        }
    }
    printf("%d\\n", a[20][20]);
    return 0;
}


  • 找规律手推

( 742 + 780 ) / 2 = 761 (742+780)/2 = 761 (742+780)/2=761

  • excel

黄色部分的数字之间的差,成等差数列,公差为4。

D_跑步锻炼

【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

使用条件

=IF(OR(B2=1, C2=1),2,1)

E 排序

本题总分:15 分

问题描述

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,
则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,
总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交
换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对
该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中不可以包含相同的字符。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

E_七段码

【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。

上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
极管,分别标记为 a, b, c, d, e, f, g。

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上
一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
//a-0,b-1,c-2,d-3,e-4,f-5,g-6
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
int ve[7][7];
bool visit[7];
int ans=0;
set<set<int> > se;
void dfs(int x,set<int> s)
{
	if(!se.count(s))
	{
		se.insert(s);
//		set<int>::iterator it;
//		for(it=s.begin();it!=s.end();it++)
//		{
//			cout<<char('a'+*it)<<" ";
//		}
//		cout<<endl;
		ans++;
	}
	if(s.size()==7)
	return ;
	for(int j=0;j<7;j++)
	{
		if(visit[j]||!ve[x][j])
		continue;
		s.insert(j);
		visit[j]=1;
		dfs(j,s);
		visit[j]=0;
		s.erase(j);
	}
}
void add(int x,int y)
{
	ve[x][y]=1;
	ve[y][x]=1;
}
int main()
{
	//a的所有边
	add(0,1);
	add(0,5);
	//b的所有边
	add(1,6);
	add(1,2);
	//c的所有边
	add(2,6); 
	add(2,3);
	//d的所有边
	add(3,4);
	//e的所有边
	add(4,5);
	add(4,6);
	//f的所有边
	add(5,6);
	set<int> s;
	for(int i=0;i<=6;i++)
	{
		s.insert(i);
		visit[i]=1;
		dfs(i,s);
		visit[i]=0;
		s.erase(i);
	}
	cout<<ans<<endl;
} 


F_成绩统计

【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
四舍五入保留整数。
【样例输入】
7
80
92
56
74
88
100
0
【样例输出】
71%
43%
【评测用例规模与约定】
对于 50% 的评测用例,1 ≤ n ≤ 100。
对于所有评测用例,1 ≤ n ≤ 10000。
涉及到四舍五入
#include <cstdio>
#include <iostream>

using namespace std;

const int N = 10000 + 5;

int n;
int q[N];
int jige_num;
int youxue_num;

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &q[i]);
        if (q[i] >= 85) {
            youxue_num++;
        }
        if (q[i] >= 60) {
            jige_num++;
        }
    }
    // printf("%d %d\\n", youxue_num, jige_num);
    printf("%.0lf%%\\n%.0lf%%\\n", double(jige_num * 100) / n, double(youxue_num * 100) / n);
    // printf("%.0lf%%\\n%.0lf%%\\n", double(jige_num * 100 / n), double(youxue_num * 100 / n ));
    return 0;
}

G_回文日期

【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2
日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,
恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为
不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA
型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个
ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千
年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个
ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
【输出格式】
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下
一个 ABABBABA 型的回文日期。

【样例输入】
20200202
【样例输出】
20211202
21211212

【评测用例规模与约定】
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的
8 位数表示。
测试数据
输入
10000101

输出
10000111
10100101
标准答案
10011001
10100101

正确做法

#include <time.h>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;


int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 20211202
int check_huiwen(int x) {
    string str = "";
    while (x) {
        char ch = x % 10 + '0';
        str = str + ch;
        x /= 10;
    }
    if (str[0] == str[7] && str[1] == str[6] && str[2] == str[5] && str[3] == str[4]) {
        return 1;
    } else {
        return 0;
    }
}

int check_ABAB(int x) {
    string str = "";
    while (x) {
        char ch = x % 10 + '0';
        str = str + ch;
        x /= 10;
    }
    // ABABBABA
    if (str[0] == str[2] && str[0] == str[5] && str[0] == str[7] && str[1] == str[3] &&
        str[1] == str[4] && str[1] == str[6] && str[0] != str[1]) {
        return 1;
    } else {
        return 0;
    }
}
bool check_valid(int year, int month, int day) {
    if (month < 1 || month > 13) {
        return 0;
    }
    if (day < 1 || day > 31) {
        return 0;
    }
    if (month != 2) 以上是关于2020年B组第二场真题的主要内容,如果未能解决你的问题,请参考以下文章

2020年第十一届蓝桥杯C/C++ B组第二场省赛真题

2020年第十一届蓝桥杯C/C++ B组第二场省赛真题

《蓝桥杯真题》:2020年单片机省赛第二场(第十一届第二场)

《蓝桥杯真题》:2020年单片机省赛第二场(第十一届第二场)

《蓝桥杯真题》:2020年单片机省赛第二场

2020第十一届蓝桥杯真题JAVA B组省赛第二场答案分享(2020.10.17)