2025蓝桥省赛c++B组第二场题解

前言

这场的题目非常的简单啊,至于为什么有第二场,因为当时河北正在刮大风被迫停止了QwQ,个人感觉是历年来最简单的一场,如果有什么不足之处,还望补充。

试题 A: 密密摆放

【问题描述】

小蓝有一个大箱子,内部的长宽高分别是 200 、250 、240 (单位:毫米),

他要用这个大箱子来放一些同样大小的小盒子,小盒子的外部长宽高分别是

30、40、50 (单位:毫米)。小盒子允许从各个方向旋转(包括可以平放和倒

放)。

请问小蓝最多可以在一个大箱子里面放多少个小盒子。

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个

整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:

200

试题 B: 脉冲强度之和

【问题描述】

在蓝桥电子工坊,工程师小蓝正在设计一款智能脉冲生成器,用于驱动一

种新型设备。该设备的运行依赖于特定的脉冲强度,用正整数 p 表示,其必须

满足以下三个条件:

  1. 可由连续 10 个正整数之和组成:即存在一个正整数 k ,使得脉冲强度
    p = k + (k + 1) + (k + 2) + · · · + (k + 9) 。
  2. 各个数位上的数字都相同:例如 1111 、22222 、333333 等。
  3. 数值不超过 20255202:即 1 ≤ p ≤ 20255202。
    通过计算所有符合条件的脉冲强度之和,小蓝能够优化设备运行模式。对
    此,请帮助他计算这一总和。

答案:

55 + 555 + 5555 + 55555 + 555555 +5555555 = 6172830

试题 C: 25 之和

【问题描述】

小蓝最近对求和很着迷,给定一个正整数 n ,他想求从 n 开始的连续 25

个整数的和,即 n + (n + 1) + (n + 2) + · · · + (n + 24) ,请帮帮他吧。

【输入格式】

输入一行包含一个正整数 n 。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入 1】

1

【样例输出 1】

325

【样例输入 2】

100

【样例输出 2】

2800

【评测用例规模与约定】

对于 40% 的评测用例,1 ≤ n ≤ 100 ;

对于所有评测用例,1 ≤ n ≤ 10000 。

答案:

应该没什么好讲的吧~

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;

int ans =0 ;


signed main() {
	int n;cin >> n;
	ans = 300 + 25 * n;
	cout << ans;
	
	return 0;
}

试题 D: 旗帜

【问题描述】

小蓝要画一个 LANQIAO 图形,并把这个图形做成一个旗帜。图形的形状

为一个 h×w 的矩形,其中 h 表示图形的高,w 表示图形的宽。当 h = 5,w = 10

时,图形如下所示:

LANQIAOLAN

ANQIAOLANQ

NQIAOLANQI

QIAOLANQIA

IAOLANQIAO

图形的规律是:第一行用 LANQIAO 重复填入,第二行开始,每行向左移

动一个字符,用 LANQIAO 重复填入。

小蓝需要把图形中的每个字母都剪出来,以粘贴到旗帜上,他想知道,给

定图形的高和宽,图形中有多少个 A 。

【输入格式】

输入的第一行包含两个正整数 h,w ,用一个空格分隔。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

5 10

【样例输出】

14

【评测用例规模与约定】

对于 30% 的评测用例,h = 1 ,1 ≤ w ≤ 20 ;

对于 60% 的评测用例,1 ≤ h,w ≤ 20 ;

对于所有评测用例,1 ≤ h,w ≤ 100 。

答案:

数据量很少,不用想太复杂,直接暴力即可。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;

int ans =0 ;
int n, m;

signed main() {
	cin >> n >> m;
	string s = "LANQIAO";
	for (int i = 0; i <n;i++) {
		int pre = i % 7;
		for (int j =0;j<m;j++){
			if (pre == 7) pre = 0;
			if (s[pre] == 'A') ans++;
			pre++;
		}
	}
	cout << ans;
	return 0;
}

试题 E: 数列差分

【问题描述】

小蓝有两个长度均为 n 的数列 A = {a1, a2, · · · , an} 和 B = {b1, b2, · · · , bn} ,将两个数列作差定义为 C = A − B = {c1 = a1 − b1, c2 = a2 − b2, · · · , cn = an − bn}。

小蓝将对数列 B 进行若干次操作,每次操作可以将数列 B 中的任意一个数更改

为任意一个整数。在进行完所有操作后,小蓝可以按任意顺序将数列 B 重排,

之后再计算数列 C 。小蓝想知道,最少操作多少次可以使得数列 C 中的所有数

都为正整数。

【输入格式】

输入的第一行包含一个正整数 n ;

第二行包含 n 个整数 a1, a2, · · · , an ,相邻整数之间使用一个空格分隔。

第三行包含 n 个整数 b1, b2, · · · , bn ,相邻整数之间使用一个空格分隔。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

4

22 31 12 14

3 19 27 44

【样例输出】

1

【样例说明】

其中一种方案:将 44 改为 0 ,重新排列 B 为 {19, 27, 3, 0} ,使得数列

C = {3, 4, 9, 14} 均为正整数。

【评测用例规模与约定】

对于 30% 的评测用例,n ≤ 10 ;

对于所有评测用例,1 ≤ n ≤ 105 ,−109 ≤ ai ≤ 109 ,−109 ≤ bi ≤ 109 。

答案:

勉强算是这场的难题吧,排序+双指针,因为b的顺序可以打乱,因此a和b即使进行排序操作也不会影响结果。

然后在a中寻找比b的数大的值,如果当前这个a不是说明这个值需要调整。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;

int ans =0 ;
int n, m;
int a[N], b[N];

signed main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < n; i++) {
		cin >> b[i];
	}
	sort(a, a + n);
	sort(b, b + n);

	int idx = 0;
	for (int i = 0; i < n;i++) {
		if (a[i] > b[idx]) {
			idx++;
		}
		else {
			ans++;
		}
	}
	
	cout << ans;
	return 0;
}

试题 F: 树上寻宝

【问题描述】

小蓝正在一棵含有 n 个结点的树的根结点 1 上,他准备在这棵树上寻宝。

结点 i 上有一个物品,价值为 wi 。然而,小蓝每次寻宝只能从根节点出发走不

超过 k 步,每步只能选择走 1 条边或者 2 条边,之后会自动拾取最终停留的结

点上的物品并被传送回根结点。请求出小蓝最终能获得的物品的总价值。

【输入格式】

输入的第一行包含两个正整数 n, k ,用一个空格分隔。

第二行包含 n 个正整数 w1,w2, · · · ,wn ,相邻整数之间使用一个空格分隔。

接下来 n − 1 行,每行包含两个正整数 ui

, vi ,用一个空格分隔,表示结点

ui 和结点 vi 之间有一条边。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

8 2

6 3 3 1 5 4 3 4

1 2

2 3

2 4

4 5

5 6

6 7

7 8

【样例输出】

22

【样例说明】

走 0 步能到的结点:1 ;

走 1 步能到的结点:2, 3, 4 ;

走 2 步能到的结点:3, 4, 5, 6 ;

因此能到的结点为:1, 2, 3, 4, 5, 6 ,能获得的总价值为 22 。

【评测用例规模与约定】

对于 20% 的评测用例,1 ≤ n ≤ 15 ;

对于所有评测用例,0 ≤ k < n ≤ 105 ,1 ≤ wi ≤ 106 ,1 ≤ ui, vi ≤ n 。

答案:

一个简单的搜索,注意考虑k为0的情况。

此外一定要存双向边,因为他题目里面写的是存在一条路径,而不是谁是谁的子节点,我有几个同学在这里挂了QwQ。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;

int ans =0 ;
int n, k;
int w[N];
vector<int>e[N];
bool vis[N];

void bfs(int num) {
	queue<int>q;
	vis[1] = 1;
	q.push(1);
	ans = w[1];
	if (num == 0) return;//这里当时写的多余了
	
	while (num-- && q.size()) {
		int a = q.size();
		while (a--) {
			int x = q.front();
			
			q.pop();
			for (auto i : e[x]) {
				if (!vis[i]) {
					vis[i] = 1;
					
					ans += w[i];
					q.push(i);
				}
			}
			
		}
	}
}
signed main() {
	cin >> n >> k;
	for (int i = 1; i <= n;i++) {
		cin >> w[i];
	}	
	for (int i = 0; i < n - 1; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	bfs(2 * k);
	cout << ans;
	return 0;
}

试题 G: 翻转硬币

【问题描述】

给定 n 行 m 列共 n × m 个硬币,对于任意一个硬币,我们将其价值视为与

其相邻(指上、下、左、右相邻)的硬币中与其正反相同的硬币数的平方。

你可以进行任意次操作,每次可以选择任意一行并将该行的硬币全部翻转。

求所有硬币的价值之和最大可能是多少。

【输入格式】

输入的第一行包含两个正整数 n, m ,用一个空格分隔。

接下来 n 行,每行包含 m 个 0 或 1 ,表示给定的 n × m 个硬币。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

4 4

1010

1111

1011

1100

【样例输出】

68

【样例说明】

如图,实线表示正面,虚线表示反面,翻转最后一行可以得到最大价值和:

【评测用例规模与约定】

对于 40% 的评测用例,n, m ≤ 20 ;

对于所有评测用例,1 ≤ n, m ≤ 1000 。

答案:

应该是最难的一道题了,感觉像是dp,本人太菜了没写出来QwQ。

试题 H: 破解信息

【问题描述】

在遥远的未来,星际旅行已经成为常态。宇航员小蓝在一次探险任务中,

意外发现了一个古老的太空遗迹。遗迹中存放着一个数据存储器,里面记录着

一段加密的信息。经过初步分析,小蓝发现这段信息可以被表示为一个字符串

S,而解密的关键,在于找出 S 中字典序最大的回文子序列。

• 子序列:指从原字符串中抽取若干个字符(可以不连续),按照它们在原

字符串中的相对顺序排列所形成的新序列。例如,对于字符串 "abc",其

子序列包括 "a"、"b"、"c"、"ab"、"ac"、"bc" 和 "abc"。

• 字典序:指字符串按照字典中的排序规则比较大小的方式。对于两个字符

串,从左到右逐字符比较,先出现较大字符的字符串字典序更大;若比较

到某个字符串结束仍未找到不同的字符,则较短的字符串字典序较小。例

如,"abc" < "abd",而 "ab" < "abc"。

现在,请你从字符串 S 中,找出字典序最大的回文子序列,帮助小蓝解开

这段来自星际文明的信息。

【输入格式】

输入一行包含一个字符串 S ,表示加密的信息。

【输出格式】

输出一行包含一个字符串,表示 S 中字典序最大的回文子序列。

【样例输入 1】

abcd

【样例输出 1】

d

【样例输入 2】

abab

【样例输出 2】

bb

【评测用例规模与约定】

对于 30% 的评测用例,1 ≤ |S | ≤ 300 ,其中 |S | 表示字符串 S 的长度;

对于所有评测用例,1 ≤ |S | ≤ 105 ,S 中只包含小写英文字母。

答案:

虚假的20分题目,此题只需要考虑字符串里面最大的字母的个数,然后输出这么长的该字符即可,原因请结合题目:对于两个字符串,从左到右逐字符比较,先出现较大字符的字符串字典序更大

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;

string s;
char ma;
int cnt = 1;
signed main() {
	cin >> s;
	for (auto i : s) {
		if (i > ma) {
			ma = i;
			cnt = 1;
		}
		else if (i == ma) {
			cnt++;
		}
	}
	for (int i = 0; i < cnt; i++) {
		cout << ma;
	}
	return 0;
}

如果对于以上题目有什么想法或者错误,欢迎与我积极讨论。

相关推荐
码银2 小时前
Java 集合:泛型、Set 集合及其实现类详解
java·开发语言
大G哥2 小时前
PHP标签+注释+html混写+变量
android·开发语言·前端·html·php
何其有幸.2 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
傻啦嘿哟2 小时前
HTTP代理基础:网络新手的入门指南
开发语言·php
fish_study_csdn2 小时前
pytest 技术总结
开发语言·python·pytest
杨筱毅3 小时前
【优秀三方库研读】【C++基础知识】odygrd/quill -- 折叠表达式
c++·三方库研读
东阳马生架构3 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
曹牧3 小时前
Java 调用webservice接口输出xml自动转义
java·开发语言·javascript
老饼讲解-BP神经网络4 小时前
一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
算法·决策树·机器学习
hjjdebug4 小时前
c++中的enum变量 和 constexpr说明符
c++·enum·constexpr