2020蓝桥杯C++ A组省赛第二场 题目+个人解法(10.17)

目录

    • 总结
    • A题 门牌制作(结果:624)
      • 问题
      • 代码
    • B题 既约分数(结果:2481215)
      • 问题
      • 代码
    • C题 蛇形填数(结果:761)
      • 问题
      • 代码
    • D题 7段码(结果:80)
      • 问题
      • 代码
    • E题 平面分割
      • 问题
      • 代码
    • F题 成绩统计
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 代码
    • G题 回文日期
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 代码
    • H题 子串分值
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 样例说明
      • 数据规模
      • 代码
    • I题 荒岛探测
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 代码
      • 样例说明
    • J题 冒泡
      • 输入
      • 输出
      • 样例输入
      • 样例输出
      • 代码
      • 数据规模

总结

太难了,先吃个饭再回来慢慢填

A题 门牌制作(结果:624)

问题

小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

代码

#include "bits/stdc++.h"
using namespace std;
int main()
{
	int count = 0;
	for (int i = 1; i <= 2020; ++i)
	{
		int temp = i;
		while (temp)
		{
			if (temp % 10 == 2) count++;
			temp /= 10;
		}
	}
			
	cout << count;
	
	return 0;
}

B题 既约分数(结果:2481215)

问题

如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如,3/4 , 5/2 , 1/8 , 7/1 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?

代码

#include "bits/stdc++.h"
using namespace std;

int gcd(int a, int b)
{
	if (a % b == 0) return b;
	if (a > b) return gcd(a - b, b);
	else return gcd(b - a, a);
}

int main()
{
	int res = 0;
	for (int i = 1; i <= 2020; ++i)
	{
		for (int j = 1; j <= 2020; ++j)
		{
			if (gcd(i, j) == 1) res++;
		}
	}
			
	cout << res;
	
	return 0;
}

C题 蛇形填数(结果:761)

问题

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

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
的数是多少?

代码

#include "bits/stdc++.h"
using namespace std;

int main()
{
	int a[50][50];
	int count = 1, level = 1;
	
	fill(a[0], a[0] + 50 * 50, 0);
	while (level < 50)
	{
		for (int i = 1, j = level; i <= level; ++i,--j)
		{
			level & 1 ? a[j][i] = count++ : a[i][j] = count++;
		}
		++level;
	}

	cout << a[20][20];
	
	return 0;
}

D题 7段码(结果:80)

问题

2020蓝桥杯C++ A组省赛第二场 题目+个人解法(10.17)_第1张图片

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

代码

E题 平面分割

问题

20 个圆和20 条直线最多能把平面分成多少个部分?

代码


F题 成绩统计

输入

输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出

输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

样例输入

7
80
92
56
74
88
99
10

样例输出

99
10
71.29

代码

2020蓝桥杯C++ A组省赛第二场 题目+个人解法(10.17)_第2张图片

G题 回文日期

输入

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个
ABABBABA 型的回文日期各是哪一天。

输出

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下
一个 ABABBABA 型的回文日期。

样例输入

20200202

样例输出

20211202
21211212

代码

#include "bits/stdc++.h"
using namespace std;
// 是回文数 
bool passOne(int n)
{ 
	string str, pre, end;
	stringstream ss;
	ss << n;
	ss >> str;
	// 前4位
	pre = str.substr(0, 4);
	// 后4位
	end = str.substr(4, 4);
	reverse(end.begin(), end.end());
	return !pre.compare(end);
}
// 是ABABBABA型回文数
bool passTwo(int n)
{
	string str;
	stringstream ss;
	ss << n / 10000;
	ss >> str;
	
	return str[0] == str[2] && str[1] == str[3] && str[0] != str[1];
} 

int main()
{
	int n;
	int one = 0;
	int two = 0;
	
	cin >> n;
	for (int i = n + 1; i <= 99999999; i++)
	{
		if (passOne(i))
		{
			if (!one) one = i;
			if (passTwo(i))
			{
				two = i;
				break;
			}
		}
	}
	cout << one << endl;
	cout << two;
	
	return 0;
}

H题 子串分值

输入

对于一个字符串S,我们定义S 的分值 f(S) 为S中恰好出现一次的字符个数。例如f (”aba”) = 1,f (”abc”) = 3, f (”aaa”) = 0。
现在给定一个字符串S[0…n-1](长度为n),请你计算对于所有S的非空子串S[i…j](0 ≤ i ≤ j < n), f (S[i… j]) 的和是多少。

输出

输出一个整数表示答案。

样例输入

ababc

样例输出

21

样例说明

子串 f值
a 1
ab 2
aba 1
abab 0
ababc 1
b 1
ba 2
bab 1
babc 2
a 1
ab 2
abc 3
b 1
bc 2
c 1

数据规模

对于20% 的评测用例,1 ≤ n ≤ 10;
对于40% 的评测用例,1 ≤ n ≤ 100;
对于50% 的评测用例,1 ≤ n ≤ 1000;
对于60% 的评测用例,1 ≤ n ≤ 10000;
对于所有评测用例,1 ≤ n ≤ 100000。

代码


I题 荒岛探测

输入

2020蓝桥杯C++ A组省赛第二场 题目+个人解法(10.17)_第3张图片
在这里插入图片描述

输出

输出一行,包含一个实数,四舍五入保留2位小数,表示答案。
考虑到计算中的误差,只要你的输出与参考输出相差不超过0.01即可得分。

样例输入

10 6 4 12 12
0 2 13 2 13 15

样例输出

39.99

代码

没做QAQ

样例说明

当输出为39.98、39.99或40.00时可以得分

J题 冒泡

输入

例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,
总共需要 4 次交换。小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 V 次交换,可是他忘了把这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 V 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。

输出

题面要求的一行字符串。

样例输入

4

样例输出

bbaa

代码


数据规模

对于20% 的评测用例,1 ≤ n ≤ 20;
对于50% 的评测用例,1 ≤ n ≤ 100;
对于100% 的评测用例,1 ≤ n ≤ 10000;

你可能感兴趣的:(刷题记录,算法,acm竞赛,数据结构)