比赛经验|2022年6月第十三届蓝桥杯软件类国赛(决赛)C组C语言/C++真题及答案 with 感想

【比赛经验|2022年6月第十三届蓝桥杯软件类国赛(决赛)C组C语言/C++真题及答案 with 感想】这里是同年省赛的真题
2022年4月第十三届蓝桥杯省赛C组C语言/C++真题及答案
感想写在前面,
备考广东专升本很久了,我的成绩是计算机类省排位299,广东专升本2022年比往年残酷了不少,近几年竞争增长比考研还要夸张很多,计算机类三万名考生里考进省前三百名才有公办本科读。
今年的蓝桥杯省赛是在升本考试前想着放松一下来参加的,蓝桥杯国赛是升本考试后疯狂放松的时候参加的,这真的不是我的水平哈哈哈,属于生锈很久了,第BDF题没做,时间不够了
近半年以来我几乎只敲过蓝桥杯省赛和国赛的这几题代码,可以说是裸考中的裸考了,c++不熟悉了,保险起见大部分题目都是纯C敲的

文章目录

    • 题目
      • 试题 A: 斐波那契与 7
      • 试题 B: 小蓝做实验
      • 试题 C: 取模
      • 试题 D: 内存空间
      • 试题 E: 斐波那契数组 9
      • 试题F: 近似GCD 11
      • 试题G: 数组个数 13
      • 试题 H: 六六大顺 16
      • 试题I: 打折 17
      • 试题 J: 替换字符
    • 答案
      • A题答案
      • B题答案
      • C题答案
      • D题答案
      • E题答案
      • F题答案
      • G题答案
      • H题答案
      • I题答案
      • J题答案

有幸帮到你的话点个赞谢谢哈~
题目 第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 A: 斐波那契与 7
本题总分:5 分
【问题描述】
斐波那契数列的递推公式为:Fn = Fnn1 + Fnn2,其中 F1 = F2 = 1。
请问,斐波那契数列的第 1 至 202202011200 项(含)中,有多少项的个位
是 7。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 A: 斐波那契与 7 2
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 B: 小蓝做实验
本题总分:5 分
【问题描述】
小蓝很喜欢科研,他最近做了一个实验得到了一批实验数据,一共是两百
万个正整数。如果按照预期,所有的实验数据 x 都应该满足 107 ≤ x ≤ 108。但
是做实验都会有一些误差,会导致出现一些预期外的数据,这种误差数据 y 的
范围是 103 ≤ y ≤ 1012 。由于小蓝做实验很可靠,所以他所有的实验数据中
99.99% 以上都是符合预期的。小蓝的所有实验数据都在 primes.txt 中,现
在他想统计这两百万个正整数中有多少个是质数,你能告诉他吗?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 B: 小蓝做实验 3
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 C: 取模
时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分
【问题描述】
给定 n, m ,问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x = n mod y 。
【输入格式】
输入包含多组独立的询问。
第一行包含一个整数 T 表示询问的组数。
接下来 T 行每行包含两个整数 n, m,用一个空格分隔,表示一组询问。
【输出格式】
输出 T 行,每行依次对应一组询问的结果。如果存在,输出单词 Yes;如
果不存在,输出单词 No。
【样例输入】
3
1 2
5 2
999 99
【样例输出】
No
No
Yes
【评测用例规模与约定】
对于 20% 的评测用例,T ≤ 100 ,n, m ≤ 1000;
试题 C: 取模 4
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
对于 50% 的评测用例,T ≤ 10000 ,n, m ≤ 105;
对于所有评测用例,1 ≤ T ≤ 105 ,1 ≤ n ≤ 109 ,2 ≤ m ≤ 109。
试题 C: 取模 5
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 D: 内存空间
时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分
【问题描述】
小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。
为了简化问题,变量的类型只有以下三种:
int:整型变量,一个 int 型变量占用 4 Byte 的内存空间。
long:长整型变量,一个 long 型变量占用 8 Byte 的内存空间。
String:字符串变量,占用空间和字符串长度有关,设字符串长度为 L,
则字符串占用 L Byte 的内存空间,如果字符串长度为 0 则占用 0 Byte 的内存
空间。
定义变量的语句只有两种形式,第一种形式为:
type var1=value1,var2=value2…;
定义了若干个 type 类型变量 var1、var2、…,并且用 value1、value2
…初始化,
多个变量之间用’,’ 分隔,语句以’; ’ 结尾,type 可能是 int、long 或
String。例如 int a=1,b=5,c=6; 占用空间为 12 Byte;long a=1,b=5;
占用空间为 16 Byte;String s1=””,s2=”hello”,s3=”world”; 占用空
间为 10 Byte。
第二种形式为:
type[] arr1=new type[size1],arr2=new type[size2]…;
定义了若干 type 类型的一维数组变量 arr1、arr2…,且数组的大小为
size1、size2…,多个变量之间用’,’ 进行分隔,语句以’; ’ 结尾,type 只可
能是 int 或 long。例如 int[] a1=new int[10]; 占用的内存空间为 40
试题 D: 内存空间 6
第十三届蓝桥杯大赛软件赛决赛C/C++大学C组
Byte;long[] a1=new long[10],a2=new long[10]; 占用的内存空间为
160 Byte。
已知小蓝有 T 条定义变量的语句,请你帮他统计下一共占用了多少内
存空间。结果的表示方式为:aGBbMBcKBdB,其中 a、b、c、d 为统计的
结果,GB、MB、KB、B 为单位。优先用大的单位来表示,1GB=1024MB, 1MB=1024KB,1KB=1024B,其中 B 表示 Byte。如果 a、b、c、d 中的某几个
数字为 0,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义
变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合
法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后
面有一个空格,以及定义数组时 new 后面的一个空格之外,不会出现多余的空
格。
【输入格式】
输入的第一行包含一个整数 T ,表示有 T 句变量定义的语句。
接下来 T 行,每行包含一句变量定义语句。
【输出格式】
输出一行包含一个字符串,表示所有语句所占用空间的总大小。
【样例输入 1】 1
long[] nums=new long[131072];
【样例输出 1】
1MB
【样例输入 2】 4
int a=0,b=0;
long x=0,y=0;
String s1=”hello”,s2=”world”;
试题D: 内存空间 7
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
long[] arr1=new long[100000],arr2=new long[100000];
【样例输出 2】
1MB538KB546B
【样例说明】
样例 1,占用的空间为 131072 × 8 = 1048576 B,换算过后正好是 1MB,其
它三个单位 GB、KB、B 前面的数字都为 0 ,所以不用输出。
样例 2,占用的空间为 4 × 2 + 8 × 2 + 10 + 8 × 100000 × 2 B,换算后是
1MB538KB546B。
【评测用例规模与约定】
对于所有评测用例,1 ≤ T ≤ 10,每条变量定义语句的长度不会超过 1000
。所有的变量名称长度不会超过 10,且都由小写字母和数字组成。对于整型变
量,初始化的值均是在其表示范围内的十进制整数,初始化的值不会是变量。
对于 String 类型的变量,初始化的内容长度不会超过 50,且内容仅包含小写
字母和数字,初始化的值不会是变量。对于数组类型变量,数组的长度为一个
整数,范围为:[0, 2
30],数组的长度不会是变量。T 条语句定义的变量所占的内
存空间总大小不会超过 1 GB,且大于 0 B。
试题 D: 内存空间 8
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 E: 斐波那契数组
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
如果数组 A = (a0, a1, · · · , ann 1) 满足以下条件,就说它是一个斐波那契数
组:
  1. n ≥ 2;
  2. a0 = a1;
  3. 对于所有的 i(i ≥ 2),都满足 ai = aii 1 + aii 2。
    现在,给出一个数组 A ,你可以执行任意次修改,每次修改将数组中的某
    个位置的元素修改为一个大于 0 的整数。请问最少修改几个元素之后,数组 A
    会变成一个斐波那契数组。
    【输入格式】
    输入的第一行包含一个整数 n ,表示数组 A 中的元素个数。
    第二行包含 n 个整数 a0, a1, · · · , ann 1,相邻两个整数之间用一个空格分隔。
    【输出格式】
    输出一行包含一个整数表示最少需要修改数组 A 中的几个元素之后,数组
    A 可以变为一个斐波那契数组。
    【样例输入】
    5
    1 2 2 4 8
    【样例输出】
    3
试题 E: 斐波那契数组 9
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
【样例说明】
将原数组修改为 (1, 1, 2, 3, 5),最少修改三个元素变成了一个斐波那契数组。
【评测用例规模与约定】
对于所有评测用例,2 ≤ n ≤ 105 ,1 ≤ ai ≤ 106。
试题 E: 斐波那契数组 10
第十三届蓝桥杯大赛软件赛决赛C/C++大学C组
试题 F: 近似 GCD
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝有一个长度为 n 的数组 A = (a1, a2, · · · , an),数组的子数组被定义为从
原数组中选出连续的一个或多个元素组成的数组。数组的最大公约数指的是数
组中所有元素的最大公约数。如果最多更改数组中的一个元素之后,数组的最
大公约数为 g,那么称 g 为这个数组的近似 GCD。一个数组的近似 GCD 可能
有多种取值。
具体的,判断 g 是否为一个子数组的近似 GCD 如下:
  1. 如果这个子数组的最大公约数就是 g,那么说明 g 是其近似 GCD。
  2. 在修改这个子数组中的一个元素之后(可以改成想要的任何值),子数
    组的最大公约数为 g,那么说明 g 是这个子数组的近似 GCD。
    小蓝想知道,数组 A 有多少个长度大于等于 2 的子数组满足近似 GCD 的
    值为 g。
    【输入格式】
    输入的第一行包含两个整数 n, g,用一个空格分隔,分别表示数组 A 的长
    度和 g 的值。
    第二行包含 n 个整数 a1, a2, · · · , an,相邻两个整数之间用一个空格分隔。
    【输出格式】
    输出一行包含一个整数表示数组 A 有多少个长度大于等于 2 的子数组的近
    似 GCD 的值为 g 。
    【样例输入】
    5 3
    1 3 6 4 10
试题F: 近似GCD 11
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
【样例输出】
5
【样例说明】
满足条件的子数组有 5 个:
[1, 3]:将 1 修改为 3 后,这个子数组的最大公约数为 3 ,满足条件。
[1, 3, 6]:将 1 修改为 3 后,这个子数组的最大公约数为 3 ,满足条件。
[3, 6]:这个子数组的最大公约数就是 3 ,满足条件。
[3, 6, 4]:将 4 修改为 3 后,这个子数组的最大公约数为 3 ,满足条件。
[6, 4]:将 4 修改为 3 后,这个子数组的最大公约数为 3,满足条件。
【评测用例规模与约定】
对于 20% 的评测用例,2 ≤ n ≤ 102;
对于 40% 的评测用例,2 ≤ n ≤ 103;
对于所有评测用例,2 ≤ n ≤ 105 ,1 ≤ g, ai ≤ 109。
试题 F: 近似 GCD 12
第十三届蓝桥杯大赛软件赛决赛C/C++大学C组
试题 G: 数组个数
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
小蓝有一个长度为 n 的数组 B = (b0, b1, · · · , bnn1),数组 B 是由另一个长度
为 n 的环形数组 A = (a0, a1, · · · , ann1) 经过一次相邻最大化操作得到的,其中 ai 与 ai+1 相邻,a0 与 ann1 相邻。
形式化描述为:
bi = ???????????????????
max(an?1, a0, a1), (i = 0);
max(ai?1, ai, ai+1), (0 < i < n ? 1);
max(an?2, an?1, a0), (i = n ? 1).
小蓝想知道,可能有多少个满足条件的数组 A,经过一次相邻最大化操作
后能得到数组 B,注意 A 中的每个元素都要求为非负整数。
【输入格式】
输入的第一行包含一个整数 n ,表示数组长度。
第二行包含 n 个整数 b0, b1, · · · , bnn1,相邻两个整数之间用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案,答案可能很大,请输出答案除以
1000000007 后的余数。
【样例输入】
5
8 6 1 8 8
试题G: 数组个数 13
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
【样例输出】
7
【样例说明】
可能的 A 数组有 7 个:(6, 0, 0, 1, 8)、(6, 0, 1, 0, 8)、(6, 0, 1, 1, 8)、(6, 1, 0, 0, 8)、
(6, 1, 0, 1, 8)、(6, 1, 1, 0, 8)、(6, 1, 1, 1, 8) 。
【评测用例规模与约定】
对于 30% 的评测用例,3 ≤ n ≤ 10;
对于 60% 的评测用例,3 ≤ n ≤ 100;
对于所有评测用例,3 ≤ n ≤ 1000 ,0 ≤ bi ≤ 10。
试题 G: 数组个数 14
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 H: 六六大顺
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
六六大顺,本指农历六月初六。多用于祝福中年人士家庭幸福,工作顺利,
事业有成,身体健康。源自《左传》“君义,臣行,父慈,子孝,兄爱,弟敬,
此数者累谓六顺也。”
6 在我国自古以来是一个吉祥的数字,定义数列 A = (a1, a2, · · · , ai, · · ·) ,
其中 a1 = 6 , a2 = 66 , · · · , ai = 10 · aii 1 + 6。
定义一个数列 B = (b1, b2, · · · , bi, · · ·),其中 b1 = 6 × 6, b2 = 66 × 66, · · · , bi = ai · ai。
现在小蓝想知道数列 B 的前 n 项的和是多少,你能帮帮小蓝吗?
【输入格式】
输入一行包含一个正整数 n 。
【输出格式】
输出一行包含一个整数表示数列 B 前 n 项的和。
【样例输入】
3
【样例输出】
447948
【样例说明】
b1 = 6 × 6 = 36, b2 = 66 × 66 = 4356, b3 = 666 × 666 = 443556,所以前三项
的和为 36 + 4356 + 443556 = 447948 。
试题 H: 六六大顺 15
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 100;
对于 50% 的评测用例,1 ≤ n ≤ 100000;
对于所有评测用例,1 ≤ n ≤ 10000000 。
试题 H: 六六大顺 16
第十三届蓝桥杯大赛软件赛决赛C/C++大学C组
试题 I: 打折
时间限制: 2.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
小蓝打算采购 n 种物品,每种物品各需要 1 个。
小蓝所住的位置附近一共有 m 个店铺,每个店铺都出售着各种各样的物
品。
第 i 家店铺会在第 si 天至第 ti 天打折,折扣率为 pi,对于原件为 b 的物
品,折后价格为 ? b·pj
100 ?
。其它时间需按原价购买。
小蓝很忙,他只能选择一天的时间去采购这些物品。请问,他最少需要花
多少钱才能买到需要的所有物品。
题目保证小蓝一定能买到需要的所有物品。
【输入格式】
输入的第一行包含两个整数 n, m,用一个空格分隔,分别表示物品的个数
和店铺的个数。
接下来依次包含每个店铺的描述。每个店铺由若干行组成,其中第一行包
含四个整数 si, ti, pi, ci,相邻两个整数之间用一个空格分隔,分别表示商店优惠
的起始和结束时间、折扣率以及商店内的商品总数。之后接 ci 行,每行包含两
个整数 aj, bj ,用一个空格分隔,分别表示该商店的第 j 个商品的类型和价格。
商品的类型由 1 至 n 编号。
【输出格式】
输出一行包含一个整数表示小蓝需要花费的最少的钱数。
【样例输入】
2 2
1 2 89 1
试题I: 打折 17
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
1 97
3 4 77 1
2 15
【样例输出】
101
【评测用例规模与约定】
对于 40% 的评测用例,n, m ≤ 500 ,si ≤ ti ≤ 100 ,∑ ci ≤ 2000 ;
对于 70% 的评测用例,n, m ≤ 5000 ,∑ ci ≤ 20000 ;
对于所有评测用例,1 ≤ n, m ≤ 100000 ,1 ≤ ci ≤ n , 1 ≤ si ≤ ti ≤ 109 ,1 < pi < 100 ,1 ≤ aj ≤ n ,1 ≤ bj ≤ 109 。 ∑ ci ≤ 400000 ,
试题 I: 打折 18
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
试题 J: 替换字符
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
给定一个仅含小写英文字母的字符串 s,每次操作选择一个区间 [li,ri] 将 s
的该区间中的所有字母 xi 全部替换成字母 yi,问所有操作做完后,得到的字符
串是什么。
【输入格式】
输入的第一行包含一个字符串 s 。
第二行包含一个整数 m 。
接下来 m 行,每行包含 4 个参数 li,ri, xi, yi,相邻两个参数之间用一个空格
分隔,其中 li,ri 为整数,xi, yi 为小写字母。
【输出格式】
输出一行包含一个字符串表示答案。
【样例输入】
abcaaea
4
1 7 c e
3 3 e b
3 6 b e
1 4 a c
【样例输出】
cbecaea
试题 J: 替换字符 19
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
【评测用例规模与约定】
对于 40% 的评测用例,|s|, m ≤ 5000;
对于所有评测用例,1 ≤ |s|, m ≤ 105 ,1 ≤ li ≤ ri ≤ |s| ,xi , yi ,其中 |s| 表
示字符串 s 的长度。
答案 并非官方答案,都是博主比赛时的答案,非绝对正确,仅供参考
A题答案
看我第一题乱七八糟的code就可以知道我比赛刚开始我有多绝望了吧,后来甚至是手算出来的,
一开始是写程序求个位数,等于7的话就count++,但是看到这么大的问题复杂度感觉不对劲啊,想着程序跑跑看,一边run一边做后面的题结果跑了20分钟还没跑出来 就意识到问题的严重了,后悔刚开始没多手算几个数,后面还想了十几分钟怎么优化,之后才发现从第13个数开始就有规律了,个位数全都是0 7 0 7 0 7 0这样子了
#include using namespace std; int ans=0; int coun=2; //int func(int a,int b) //{ // // // coun++; // if(coun==2022020112) //return 0; // func(b,c); //} int main() { // int a=1,b=1; // while(coun<202202011200) // { //coun++; //int tmp = a; //a = b; //b = (tmp+b)%10; //if(b==7) //ans++; // } long long ans = (202202011200-13)/2; 202202011187 101101005593 101101005594 printf("%lld",ans); return 0; } //1 1 2 3 5 8 13 21 34 55 89 4 3 7 0 7 0 //1 1 2 3 5 8 3 1 4 5 9 4 3 7 0 7

B题答案
B题博主没做,但是想吐槽一下哈哈。
第一题我就卡了半个多钟,已经心态崩了好吧,看到第二题涉及到概率问题果断跳过了,毕竟才5分,到最后基本所有题都做了还是对这5分没兴趣。
C题答案
这题我的时间复杂度应该是不合格的,只是想拿部分分,后面还有很多题,就速度过了
#include using namespace std; int ans[100010]; int main() { int T,i; scanf("%d",&T); for(i=0; i

D题答案
D题我当时也直接放了,字符处理的题从来不会让你快速解出来,考csp的时候题目少还会考虑一下,蓝桥杯动不动就十道题比的就是速度。
E题答案
博主思路:每道题水一点分哈哈哈哈哈
这道题不知道能不能混一两个案例,只是把开头的两个数的三种情况列举了出来,其它完全没考虑了,没思路,怎么想复杂度都很高
#include using namespace std; int arr[100000]; int main() { int n,i; int this_ans = 0; int ans = 0; scanf("%d",&n); for(i=0; i

F题答案
大概看了一下题,理不清思路,关键是公约数忘了怎么求,只好放弃了
G题答案
希望寄托于这题了,
考的基本的深度和裁枝
#include using namespace std; int arrB[1010]; int arrA[1010]={0}; int ans=0,n; int mymax(int a,int b,int c) { if(a>=b&&a>=c) return a; else if(b>=a&&b>=c) return b; else return c; }int DFS(int id) { int i,j; for(i=0; i<=10; i++) { arrA[id]= i; if(id>1) { j=id-1; if(arrB[j]!=mymax(arrA[j-1],arrA[j],arrA[j+1])) continue; } if(id==n-1) { int ok=1; if(arrB[0]!=mymax(arrA[n-1],arrA[0],arrA[1])) { ok=0; continue; } if(arrB[n-1]!=mymax(arrA[n-2],arrA[n-1],arrA[n])) { ok=0; continue; } // for(j=0; j

H题答案
水分水分
#include using namespace std; int main() { int n,i,j,value=https://www.it610.com/article/6,ans=0; scanf("%d",&n); for(i=1; i<=n; i++) { ans+=value*value; value = https://www.it610.com/article/value*10+6; } printf("%d",ans); return 0; }

I题答案
这题是最后才做的,还没敲完就比赛结束了,轮廓都敲出来了,虽然运行不了,但是放出来看一下吧
#include using namespace std; int cost[100]; int zhong[100][100000]={0}; int zhongMoney[100]; int main() { int n,m,i,j; scanf("%d %d",&n,&m); for(i=0; i=s && k<=t) tmpzhongMoney=b*p/100; else tmpzhongMoney=b; if(zhongMoney[a]==0) { cost[k]+=tmpzhongMoney; zhongMoney[a] =tmpzhongMoney; }else if(tmpzhongMoney

J题答案
做这题的时候是真的离谱
首先是我忘了scanf读取字符要怎么敲
然后又不知道为什么内存泄漏,蓝桥杯官方给的devc编辑器直接没反应了,一跑程序windows就提示病毒,我也是第一次遇见这种情况哈哈哈哈,后来换了我平时用的codeblocks编译时会提醒我哪里代码有问题,改好就正常了
比赛经验|2022年6月第十三届蓝桥杯软件类国赛(决赛)C组C语言/C++真题及答案 with 感想
文章图片

同样拿基础分,“优化”这种东西你想得到就很快想出来了,想不到就别死磕了,蓝桥杯每道题能拿一半分也稳国一了吧,当然我拿不到哈哈哈
#include using namespace std; char str[100010]; int main() { int m,i,j; scanf("%s",str); scanf("%d",&m); for(i=0; i

    推荐阅读