2022年4月第十三届蓝桥杯省赛C组C语言/C++真题及答案

参加了这么多算法类比赛和认证,总结出一个很重要的能力,
project 的评估能力:能否较为准确的判断出 以自己现在的 level 是否能完成某道题目、以及完成这道题要耗费多少时间
特别在比赛这种高压环境下,总想着抓住每分每秒看到题就 “just do it” ,一点思路没有的bug还猛钻 以为马上就 OK 了。
事实证明这是不太好的决策,当自己的 level 还没有达到能快速AC所有题目之前,还是要分清每道题孰轻孰重,若第一时间按照自己的思路发现某道题工程量已经大到不可估量的话 必须及时 give up 或者计划好只拿一部分分,毕竟每个人对不同的题型熟练度肯定也不同。

顺便吐槽一下,蓝桥杯根本不是考验对算法的理解程度,而是考验选手 coding 熟练度,四小时十道编程题 who can do this??? 提交了还不给结果反馈,有几道题问题规模还是挺大的,还要自己评估程序的时间复杂度,对我这种不敲代码的 coder 来说,“不用谢,下次不参与了”
瞧瞧隔壁ACM、CCSP,都是可以带书甚至可以带u盘的,从这点可以看出蓝桥杯考的全是编程基本功了

文章目录

    • 题目
      • 试题 A: 排列字母
      • 试题 B: 特殊时间
      • 试题 C: 纸张尺寸
      • 试题 D: 求和
      • 试题 E: 数位排序
      • 试题 F: 选数异或
      • 试题 G: 消除游戏
      • 试题 H: 重新排序
      • 试题 I: 技能升级
      • 试题 J: 重复的数
    • 答案
      • A题答案:
      • B题答案:
      • C题答案:
      • D题答案:
      • E题答案:
      • F题答案:
      • G题答案:

有幸帮到你的话不要忘了赞赞哈三克油~

题目

第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组
第十三届蓝桥杯大赛软件赛省赛
C/C++ 大学 C 组
【考生须知】
考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试
题。
考试时间为 4 小时。考试期间选手可浏览自己已经提交的答案,被浏览的
答案允许拷贝。时间截止后,将无法继续提交或浏览答案。
对同一题目,选手可多次提交答案,以最后一次提交的答案为准。
选手必须通过浏览器方式提交自己的答案。选手在其它位置的作答或其它
方式提交的答案无效。
试题包含“结果填空”和“程序设计”两种题型。
结果填空题:要求选手根据题目描述直接填写结果。求解方式不限。不要
求源代码。把结果填空的答案直接通过网页提交即可,不要书写多余的内容。
程序设计题:要求选手设计的程序对于给定的输入能给出正确的输出结果。
考生的程序只有能运行出正确结果才有机会得分。
注意:在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。
选手的程序必须是通用的,不能只对试卷中给定的数据有效。
对于编程题目,要求选手给出的解答完全符合 GNU C/C++ 标准,不能使
用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的 API。
代码中允许使用 STL 类库。
注意: main 函数结束必须返回 0。
注意: 所有依赖的函数必须明确地在源文件中 #include ,不能通
过工程设置而省略常用头文件。
所有源码必须在同一文件中。调试通过后,拷贝提交。
提交时,注意选择所期望的编译器类型。
第十三届蓝桥杯大赛软件赛省赛 1
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 A: 排列字母

本题总分:5 分
【问题描述】
小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,LANQIAO 排列后为 AAILNOQ。
又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY

请问对于以下字符串,排列之后字符串是什么?
WHERETHEREISAWILLTHEREISAWAY
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内
容将无法得分。
试题 A: 排列字母 2
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 B: 特殊时间

本题总分:5 分
【问题描述】
2022 年 2 月 22 日 22:20 是一个很有意义的时间,年份为 2022,由 3 个 2 和 1 个 0 组成,如果将月和日写成 4 位,为 0222,也是由 3 个 2 和 1 个 0 组
成,如果将时间中的时和分写成 4 位,还是由 3 个 2 和 1 个 0 组成。
小蓝对这样的时间很感兴趣,他还找到了其它类似的例子,比如 111 年 10
月 11 日 01:11,2202 年 2 月 22 日 22:02 等等。
请问,总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成
4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日 11:11
不算,因为它里面没有两种数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 B: 特殊时间 3
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 C: 纸张尺寸

时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分
【问题描述】
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸
沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取
下整(实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。
【输入格式】
输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、
A3、A4、A5、A6、A7、A8、A9 之一。
【输出格式】
输出两行,每行包含一个整数,依次表示长边和短边的长度。
【样例输入 1】
A0
【样例输出 1】
1189
841
【样例输入 2】
A1
【样例输出 2】
841
594
试题 C: 纸张尺寸 4
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 D: 求和

时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分
【问题描述】
给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即
S = a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + ann 2 · ann 1 + ann 2 · an + ann 1 · an.
【输入格式】
输入的第一行包含一个整数 n 。
第二行包含 n 个整数 a1, a2, · · · an。
【输出格式】
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
【样例输入】
4
1 3 6 9
【样例输出】
117
【评测用例规模与约定】
对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。
试题 D: 求和 5
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 E: 数位排序

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当
两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,
将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位
之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元
素是多少?
【输入格式】
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
13
5
【样例输出】
3
试题 E: 数位排序 6
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组
【样例说明】
1 到 13 的排序为:1, 10, 2, 11, 3, 12, 4, 13, 5, 6, 7, 8, 9。第 5 个数为 3。
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ m ≤ n ≤ 300。
对于 50% 的评测用例,1 ≤ m ≤ n ≤ 1000。
对于所有评测用例,1 ≤ m ≤ n ≤ 106。
试题 E: 数位排序 7
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 F: 选数异或

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查
询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x 。
【输入格式】
输入的第一行包含三个整数 n, m, x 。
第二行包含 n 个整数 A1, A2, · · · , An 。
接下来 m 行,每行包含两个整数 li,ri 表示询问区间 [li,ri] 。
【输出格式】
对于每个询问, 如果该区间内存在两个数的异或为 x 则输出 yes, 否则输出
no。
【样例输入】
4 4 1
1 2 3 4
1 4
1 2
2 3
3 3
【样例输出】
yes
no
yes
no
试题 F: 选数异或 8
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组
【样例说明】
显然整个数列中只有 2, 3 的异或为 1。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n, m ≤ 100;
对于 40% 的评测用例,1 ≤ n, m ≤ 1000;
对于所有评测用例,1 ≤ n, m ≤ 100000 ,0 ≤ x < 2
20 ,1 ≤ li ≤ ri ≤ n , 0 ≤ Ai < 2
20。
试题 F: 选数异或 9
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 G: 消除游戏

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
在一个字符串 S 中,如果 S i = S ii 1 且 S i , S i+1 ,则称 S i 和 S i+1 为边缘
字符。如果 S i , S ii 1 且 S i = S i+1,则 S ii 1 和 S i 也称为边缘字符。其它的字符
都不是边缘字符。
对于一个给定的串 S,一次操作可以一次性删除该串中的所有边缘字符
(操作后可能产生新的边缘字符)。
请问经过 2
64 次操作后,字符串 S 变成了怎样的字符串,如果结果为空则
输出 EMPTY。
【输入格式】
输入一行包含一个字符串 S 。
【输出格式】
输出一行包含一个字符串表示答案,如果结果为空则输出 EMPTY。
【样例输入 1】
edda
【样例输出 1】
EMPTY
【样例输入 2】
sdfhhhhcvhhxcxnnnnshh
【样例输出 2】 s
试题 G: 消除游戏 10
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组
【评测用例规模与约定】
对于 25% 的评测用例,|S | ≤ 103 ,其中 |S | 表示 S 的长度;
对于 50% 的评测用例,|S | ≤ 104 ;
对于 75% 的评测用例,|S | ≤ 105 ;
对于所有评测用例,|S | ≤ 106,S 中仅含小写字母。
试题 G: 消除游戏 11
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 H: 重新排序

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
给定一个数组 A 和一些查询 Li, Ri,求数组中第 Li 至第 Ri 个元素之和。
小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查
询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可
以增加多少?
【输入格式】
输入第一行包含一个整数 n。
第二行包含 n 个整数 A1, A2, · · · , An,相邻两个整数之间用一个空格分隔。
第三行包含一个整数 m 表示查询的数目。
接下来 m 行,每行包含两个整数 Li、Ri ,相邻两个整数之间用一个空格分
隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
5
1 2 3 4 5
2
1 3
2 5
【样例输出】
4
试题 H: 重新排序 12
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组
【样例说明】
原来的和为 6 + 14 = 20,重新排列为 (1, 4, 5, 2, 3) 后和为 10 + 14 = 24,增
加了 4。
【评测用例规模与约定】
对于 30% 的评测用例,n, m ≤ 50 ;
对于 50% 的评测用例,n, m ≤ 500 ;
对于 70% 的评测用例,n, m ≤ 5000 ;
对于所有评测用例,1 ≤ n, m ≤ 105,1 ≤ Ai ≤ 106,1 ≤ Li ≤ Ri ≤ 106 。
试题 H: 重新排序 13
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

试题 I: 技能升级

时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
小蓝最近正在玩一款 RPG 游戏。他的角色一共有 N 个可以加攻击力的技
能。其中第 i 个技能首次升级可以提升 Ai 点攻击力,以后每次升级增加的点数
都会减少 Bi。⌈ Ai Bi⌉ (上取整) 次之后,再升级该技能将不会改变攻击力。
现在小蓝可以总计升级 M 次技能,他可以任意选择升级的技能和次数。请
你计算小蓝最多可以提高多少点攻击力?
【输入格式】
输入第一行包含两个整数 N 和 M。
以下 N 行每行包含两个整数 Ai 和 Bi。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3 6
10 5
9 2
8 1
【样例输出】
47
【评测用例规模与约定】
对于 40% 的评测用例,1 ≤ N, M ≤ 1000;
试题 I: 技能升级 14
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组
对于 60% 的评测用例,1 ≤ N ≤ 104, 1 ≤ M ≤ 107;
对于所有评测用例,1 ≤ N ≤ 105,1 ≤ M ≤ 2 × 109,1 ≤ Ai, Bi ≤ 106。
试题 I: 技能升级 15
第十三届蓝桥杯大赛软件赛省赛C/C++大学C组

试题 J: 重复的数

时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
给定一个数列 A = (a1, a2, · · · , an),给出若干询问,每次询问某个区间 [li,ri]
内恰好出现 ki 次的数有多少个。
【输入格式】
输入第一行包含一个整数 n 表示数列长度。
第二行包含 n 个整数 a1, a2, · · · , an,表示数列中的数。
第三行包含一个整数 m 表示询问次数。
接下来 m 行描述询问,其中第 i 行包含三个整数 li,ri, ki 表示询问 [li,ri] 区
间内有多少数出现了 ki 次。
【输出格式】
输出 m 行,分别对应每个询问的答案。
【样例输入】
3
1 2 2
5
1 1 1
1 1 2
1 2 1
1 2 2
1 3 2
【样例输出】
1
试题J: 重复的数 16
第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组 0201
【评测用例规模与约定】
对于 20% 的评测用例,n, m ≤ 500, 1 ≤ a1, a2, · · · , an ≤ 1000;
对于 40% 的评测用例,n, m ≤ 5000;
对于所有评测用例,1 ≤ n, m ≤ 100000, 1 ≤ a1, a2, · · · , an ≤ 100000, 1 ≤ li ≤ ri ≤ n, 1 ≤ ki ≤ n。
试题 J: 重复的数 17

答案

并非官方答案,都是博主比赛时的答案,非绝对正确,仅供参考

A题答案:

#include 
using namespace std;

int main()
{
	char str[] = "WHERETHEREISAWILLTHEREISAWAY";
	printf("%s\n",str);
	printf("%d\n",strlen(str));
	sort(str,str+strlen(str));
	printf("%s",str);
	return 0;
} 

B题答案:

#include 
using namespace std;

int main()
{
	int nian = 1;
	int yueri = 101;
	int shijian = 0;
	int out=0;
	while(!(nian==2022 && yueri==409))
	{
		if(shijian%100>59)
			shijian = (shijian/100)*100+100;
		if(shijian/100>23)
			shijian = 0,yueri++;
		if(yueri%100>30)
			yueri = (yueri/100)*100+101;
		if(yueri/100>12)
			yueri = 101,nian++;
		
		
		int count_nian[10]={0,0,0,0,0,0,0,0,0,0};
		int n1,n2,n3,n4,ok_nian=0,i;
		n1 = nian/1000;
		n2 = nian%1000/100;
		n3 = nian%100/10;
		n4 = nian%10;
		count_nian[n1]++;
		count_nian[n2]++;
		count_nian[n3]++;
		count_nian[n4]++;
		for(i=0;i<10;i++)
			if(count_nian[i]==3)
				ok_nian=1;
		if(!ok_nian)
		{
			yueri=101;
			shijian=0;
			nian++;
			continue;
		}
		 
		int count_yue[10]={0,0,0,0,0,0,0,0,0,0};
		int y1,y2,y3,y4,ok_yue=0;
		y1 = yueri/1000;
		y2 = yueri%1000/100;
		y3 = yueri%100/10;
		y4 = yueri%10;
		count_yue[y1]++;
		count_yue[y2]++;
		count_yue[y3]++;
		count_yue[y4]++;
		for(i=0;i<10;i++)
			if(count_yue[i]==3)
				ok_yue=1;
		if(!ok_yue)
		{
			shijian=0;
			yueri++;
			continue;
		}
		
		int count_shijian[10]={0,0,0,0,0,0,0,0,0,0};
		int s1,s2,s3,s4,ok_shijian=0;
		s1 = shijian/1000;
		s2 = shijian%1000/100;
		s3 = shijian%100/10;
		s4 = shijian%10;
		count_shijian[s1]++;
		count_shijian[s2]++;
		count_shijian[s3]++;
		count_shijian[s4]++;
		for(i=0;i<10;i++)
			if(count_shijian[i]==3)
				ok_shijian = 1;
		if(!ok_shijian)
		{
			shijian++;
			continue;
		}
			
			
		
		y4 = yueri%10;
		if(y4!=0)
		{
			out++;
			printf("OK nian:%4d, yueri:%4d, shijian:%4d\n",nian,yueri,shijian);
		}
		shijian++;
	}
	printf("\n\nout:%d",out); 
	return 0;
} 















C题答案:

#include 
using namespace std;

struct ST{
	int chang,kuan;
}arr[10];

int main()
{
	arr[0].chang = 1189;
	arr[0].kuan = 841;
	int i;
	for(i=1;i<10;i++)
	{
		arr[i].kuan = arr[i-1].chang/2;
		arr[i].chang = arr[i-1].kuan;
	}
	int in;
	getchar();
	scanf("%d",&in);
	printf("%d\n%d",arr[in].chang,arr[in].kuan);
	return 0;
} 

D题答案:

#include 
using namespace std;

int arr[200000]={0};
int main()
{
	long long out=0;
	int n,i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&arr[i]);
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(i==j)
				break;
			out+=arr[i]*arr[j];
		}
	printf("%lld",out);
	return 0;
} 

E题答案:

#include 
using namespace std;

struct ST{
	int value;
	short shuwei;
}arr[1000010];


bool cmp(struct ST a,struct ST b)
{
	if(a.shuwei==-1)
	{
		a.shuwei=0;
		a.shuwei += a.value/1000000;
		a.shuwei += a.value%1000000/100000;
		a.shuwei += a.value%100000 /10000;
		a.shuwei += a.value%10000  /1000;
		a.shuwei += a.value%1000   /100;
		a.shuwei += a.value%100   /10;
		a.shuwei += a.value%10;
		arr[a.value].shuwei = a.shuwei;
	}
	
	if(b.shuwei==-1)
	{
		b.shuwei=0;
		b.shuwei += b.value/1000000;
		b.shuwei += b.value%1000000/100000;
		b.shuwei += b.value%100000 /10000;
		b.shuwei += b.value%10000  /1000;
		b.shuwei += b.value%1000   /100;
		b.shuwei += b.value%100   /10;
		b.shuwei += b.value%10;
		arr[b.value].shuwei = b.shuwei;
	}
		
	if(a.shuwei != b.shuwei)
		return a.shuwei<b.shuwei;
	else
		return a.value<b.value;
}
int main()
{
	int i,j,n,m;
	scanf("%d",&n);
	scanf("%d",&m);
	for(i=1;i<=n;i++)
	{
		arr[i].shuwei=-1;
		arr[i].value = i;
	}
	sort(arr+1,arr+n+1,cmp);
	//for(i=1;i<=n;i++)
//		printf("shuwei:%hd  value:%d\n",arr[i].shuwei,arr[i].value);
	printf("%d",arr[m].value);
	return 0;
} 














F题答案:

#include 
using namespace std;

long long arr[100010]={0};
char arr_out[100010]={0};//m,1yes
int main()
{
	int n,m,i,j,k;
	long long x;
	scanf("%d %d %lld",&n,&m,&x);
	for(i=1;i<=n;i++)
		scanf("%lld",&arr[i]);
		
	for(k=0;k<m;k++)
	{
		int l,r;
		scanf("%d %d",&l,&r);
		for(i=l;i<r;i++)
		{
			int should_break_yes=0;
			for(j=i;j<=r;j++)
			{
				if(i==j)
					continue;
				if((arr[i]^arr[j])==x)
				{
					should_break_yes=1;
					arr_out[k]=1;
//					printf("arri:%lld,arrj:%lld,arr[i]^arr[j]: %lld  ,x:%lld\n",arr[i],arr[j],arr[i]^arr[j],x);
					break;
				}
			}
			if(should_break_yes)
				break;
		}
	}
	
	for(k=0;k<m-1;k++)
		if(arr_out[k])
			printf("yes\n");
		else
			printf("no\n");
			
	if(arr_out[k])
			printf("yes");
		else
			printf("no");
	
	return 0;
} 

G题答案:

#include 
using namespace std;

//char str = [1000010];
const long long pow264 = (long long)pow(2.0,64.0);
string str;
int del[1000010] = {0};
int del_len=0;

bool cmp(int a,int b)
{
	return a<b;
}
int main()
{
	long long i,j,k;
	cin>>str;
	for(k=0;k<pow264;k++)
	{
//		cout<
		int have_erase = 0;
		del_len = 0;
		for(i=1;i<str.length()-1;i++)
		{
			if((str[i-1]==str[i])&&(str[i]!=str[i+1]))
			{
				 del[del_len++] = i;
				 del[del_len++] = i+1;
				 have_erase = 1;
			}
			if((str[i-1]!=str[i])&&(str[i]==str[i+1]))
			{
				 del[del_len++] = i-1;
				 del[del_len++] = i;
				 have_erase = 1;
			}
		}
		
		sort(del,del+del_len+1,cmp);
		while(del_len>=1)
		{
			cout<<del[del_len]<<"\n";
			if(del[del_len]<str.length())
				str.erase(del[del_len--],1);
			else
				del_len--;
		}
		
		if(!have_erase || str.length()<=1)
			break;
	}
	if(str.length()>0)
		cout<<str;
	else
		cout<<"EMPTY";
		
	return 0;
} 

你可能感兴趣的:(其它算法题,比赛经验,蓝桥杯,刷题,c语言,c++,比赛)