发布时间:2023-12-12 09:00
这里是同年省赛的真题
2022年4月第十三届蓝桥杯省赛C组C语言/C++真题及答案
感想写在前面,
备考广东专升本很久了,我的成绩是计算机类省排位299,广东专升本2022年比往年残酷了不少,近几年竞争增长比考研还要夸张很多,计算机类三万名考生里考进省前三百名才有公办本科读。
今年的蓝桥杯省赛是在升本考试前想着放松一下来参加的,蓝桥杯国赛是升本考试后疯狂放松的时候参加的,这真的不是我的水平哈哈哈,属于生锈很久了,第BDF题没做,时间不够了
近半年以来我几乎只敲过蓝桥杯省赛和国赛的这几题代码,可以说是裸考中的裸考了,c++不熟悉了,保险起见大部分题目都是纯C敲的
有幸帮到你的话点个赞谢谢哈~
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
本题总分:5 分
【问题描述】
斐波那契数列的递推公式为:Fn = Fnn1 + Fnn2,其中 F1 = F2 = 1。
请问,斐波那契数列的第 1 至 202202011200 项(含)中,有多少项的个位
是 7。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 A: 斐波那契与 7 2
第十三届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
本题总分:5 分
【问题描述】
小蓝很喜欢科研,他最近做了一个实验得到了一批实验数据,一共是两百
万个正整数。如果按照预期,所有的实验数据 x 都应该满足 107 ≤ x ≤ 108。但
是做实验都会有一些误差,会导致出现一些预期外的数据,这种误差数据 y 的
范围是 103 ≤ y ≤ 1012 。由于小蓝做实验很可靠,所以他所有的实验数据中
99.99% 以上都是符合预期的。小蓝的所有实验数据都在 primes.txt 中,现
在他想统计这两百万个正整数中有多少个是质数,你能告诉他吗?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 B: 小蓝做实验 3
第十三届蓝桥杯大赛软件赛决赛 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 组
时间限制: 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) 满足以下条件,就说它是一个斐波那契数
组:
第十三届蓝桥杯大赛软件赛决赛 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 如下:
第十三届蓝桥杯大赛软件赛决赛 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
第十三届蓝桥杯大赛软件赛决赛 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 。
第十三届蓝桥杯大赛软件赛决赛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
第十三届蓝桥杯大赛软件赛决赛 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 组
时间限制: 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 的长度。
并非官方答案,都是博主比赛时的答案,非绝对正确,仅供参考
看我第一题乱七八糟的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题博主没做,但是想吐槽一下哈哈。
第一题我就卡了半个多钟,已经心态崩了好吧,看到第二题涉及到概率问题果断跳过了,毕竟才5分,到最后基本所有题都做了还是对这5分没兴趣。
这题我的时间复杂度应该是不合格的,只是想拿部分分,后面还有很多题,就速度过了
#include
using namespace std;
int ans[100010];
int main()
{
int T,i;
scanf("%d",&T);
for(i=0;i<T;i++)
{
int n,m,x,y,ok=0;
scanf("%d %d",&n,&m);
for(x=1;x<m;x++)
{
for(y=x+1;y<=m;y++)
{
if(n%x==n%y)
ok=1;
if(ok)
break;
}
if(ok)
break;
}
if(ok)
ans[i]=1;
else
ans[i]=0;
}
for(i=0;i<T;i++)
{
if(ans[i])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
D题我当时也直接放了,字符处理的题从来不会让你快速解出来,考csp的时候题目少还会考虑一下,蓝桥杯动不动就十道题比的就是速度。
博主思路:每道题水一点分哈哈哈哈哈
这道题不知道能不能混一两个案例,只是把开头的两个数的三种情况列举了出来,其它完全没考虑了,没思路,怎么想复杂度都很高
#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<n;i++)
scanf("%d",&arr[i]);
if(arr[0]==arr[1])
{
int a=arr[0],b=arr[1],tmp;
for(i=2;i<n;i++)
{
tmp = a;
a = b;
b = tmp+b;
if(b!=arr[i])
ans++;
}
}else
{
int a=arr[0],b=arr[0],tmp;
ans++;
for(i=2;i<n;i++)
{
tmp = a;
a = b;
b = tmp+b;
if(b!=arr[i])
ans++;
}
a=arr[1],b=arr[1];
this_ans = 0;
for(i=2;i<n;i++)
{
tmp = a;
a = b;
b = tmp+b;
if(b!=arr[i])
this_ans++;
}
if(this_ans<ans)
ans = this_ans;
}
printf("%d",ans);
return 0;
}
大概看了一下题,理不清思路,关键是公约数忘了怎么求,只好放弃了
希望寄托于这题了,
考的基本的深度和裁枝
#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
// {
// printf("%d ",arrA[j]);
// }
// printf("\n");
if(ok)
{
ans++;
ans=ans%1000000007;
}
}else
{
DFS(id+1);
}
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arrB[i]);
}
DFS(0);
printf("%d",ans);
return 0;
}
水分水分
#include
using namespace std;
int main()
{
int n,i,j,value=6,ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
ans+=value*value;
value = value*10+6;
}
printf("%d",ans);
return 0;
}
这题是最后才做的,还没敲完就比赛结束了,轮廓都敲出来了,虽然运行不了,但是放出来看一下吧
#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<m;i++)
{
int s,t,p,c;
scanf("%d %d %d %d",&s,&t,&p,&c);
for(j=0;j<c;j++)
{
int a,b,k;
scanf("%d %d",&a,&b);
for(k=0;k<100;k++)
{
int tmpzhongMoney;
if(k>=s && k<=t)
tmpzhongMoney=b*p/100;
else
tmpzhongMoney=b;
if(zhongMoney[a]==0)
{
cost[k]+=tmpzhongMoney;
zhongMoney[a] =tmpzhongMoney;
}else if(tmpzhongMoney<zhongMoney[a])
{
cost[k]-=zhongMoney[a];
cost[k]+=tmpzhongMoney;
zhongMoney[a] =tmpzhongMoney;
}
}
}
}
int ans=cost[0];
for(i=0;i<m;i++)
{
if(cost[i]<ans)
ans = cost[i];
}
printf("%d",ans);
return 0;
}
做这题的时候是真的离谱
首先是我忘了scanf读取字符要怎么敲
然后又不知道为什么内存泄漏,蓝桥杯官方给的devc编辑器直接没反应了,一跑程序windows就提示病毒,我也是第一次遇见这种情况哈哈哈哈,后来换了我平时用的codeblocks编译时会提醒我哪里代码有问题,改好就正常了
同样拿基础分,“优化”这种东西你想得到就很快想出来了,想不到就别死磕了,蓝桥杯每道题能拿一半分也稳国一了吧,当然我拿不到哈哈哈
#include
using namespace std;
char str[100010];
int main()
{
int m,i,j;
scanf("%s",str);
scanf("%d",&m);
for(i=0;i<m;i++)
{
int l,r;
char x,y;
scanf("%d %d",&l,&r);
getchar();
x= getchar();
getchar();
y= getchar();
for(j=l-1;j<r;j++)
if(str[j]==x)
str[j]=y;
}
printf("%s",str);
return 0;
}