【题目全解】蓝桥杯24省赛C++中高级组题干题解

news/2024/9/21 5:32:57/文章来源:https://www.cnblogs.com/Macw07/p/18395720

本帖只提供六道编程题的解题思路,部分题目并不提供实际的代码(因为我赛时忘记把代码截图下来了)。

T1 - 看书

题干描述: 一本书共 \(n\) 页,小明计划第一天看 \(x\) 页,此后每一天都要比前一天多看 \(y\)
页,请问小明几天可以看完这本书?

输入格式: 一行输入三个整数 \(n\)\(x\)\(y\) \((20\le n\le 5000,1\le x,y\le 20)\),分别表示书的总页数、计划第一天看的页数以及此后每天都要比前一天多看的页数,整数之间以一个空格隔开。

输出格式: 输出一个整数,表示小明几天可以看完这本书。

样例输入:100 10 5

样例输出:5

解题思路: 防爆零题。用一个 while 循环来判断还有多少页的书需要看,循环里拿一个变量来记录循环次数作为答案即可。

T2 - 数字交换

题干描述: 给定一个正整数 \(n\),请将 \(n\) 的最高位与最低位的数字进行交换,并输出交换后的结果。如果交换后的结果有前导 \(0\),去除前导 \(0\) 后再输出结果。

输入描述: 输入一个正整数 \(n (100\le n\le10^9)\)

输出描述: 输出答案。

样例输入: 173

样例输出: 371

解题思路: 以字符串的形式来读入字符,先用 C++ 自带的 swap 交换该字符串的第一位和最后一位。之后用 while 循环记录第一个合法数字出现的位置(即删除前导零)。最后用 string 类的 .substr() 方法截取字符串有效子串。

T3 - 出现奇数次的数

题干描述: 给定 \(n\) 个整数,其中只有一个数出现了奇数次,请找出这个数。

输入格式:

第一行输入一个整数 \(n (1\le n \le 10^5)\)
第二行输入 \(n\) 个整数 \((1\le 整数\le 10^9)\),整数之间以一个空格隔开(数据保证只有一个数出现了奇数次)

输出格式: 输出一个整数,表示出现了奇数次的数。

样例输入:

7
6 2 4 6 4 2 6

样例输出:

6

解题思路:

这道题可以有多种算法来解。一种方法是使用 sort 函数对数组排序,然后找出某个出现奇数次的数即可。还可以用 STL 的 map 数据结构,类似桶排序的方法,来记录某一个键出现的次数,最后扫一遍就可以找出来了。

最方便的做法是使用异或的性质来快速找到某个出现奇数次的数。具体地,将数组中的所有元素依次进行异或运算,最终结果就是唯一一个出现奇数次的数,因为出现偶数次的数都会在异或中抵消掉。

代码展示:

#include <iostream>
using namespace std;int main(){int n, t, ans = 0;cin >> n; while(n--){cin >> t;ans ^= t;}cout << ans << endl;return 0;
}

T4 - 字母移位

这道题是我觉得整一场比赛中最有问题的题目了。开了 long long 过不了,不开 long long 不取模竟然是过得了的。这证明这道题的数据是有问题的。(一个半小时的考试,这道题浪费了我一个小时的调试时间。我只能说,出题组太垃圾了)。

题干描述:

字母移位:表示将字母按照字母表的顺序进行移动。

例如:'b' 向右移动一位是 'c',“向左移动两位是 'd'。

特别地,'a' 向左移动一位是 'z','z' 向右移动一位是 'a'。

给定一个仅包含小写字母且长度为 \(n\) 的字符串 \(s\),以及 \(n\) 个正整数 \(a_1, a_2, \dots, a_n\),接下来对字符串 \(s\) 按如下规律操作:

  1. 将第 \(1\) 位字符向左移动 \(a_1\) 位;
  2. 再将第 \(1、2\) 位字符都向右移动 \(a_2\) 位;
  3. 再将第 \(1、2、3\) 位字符都向左移动 \(a_3\) 位;
  4. 再将第 \(1、2、3、4\) 位字符都向右移动 \(a_4\) 位;

以此类推,直到将 \(s\) 的第 \(1\) 到第 \(n\) 位字符都(按规律向左或向右)移动完毕。

最后,将操作完成后的字符串 \(s\) 输出。

例如:\(n = 5\),字符串 s = "abcde",\(5\) 个正整数为 1, 3, 5, 7, 9;

将 "abcde" 的第 \(1\) 位字符 "a" 向左移动 \(1\) 位,\(s\) 变为 "zbcde";

再将 "zbcde" 的前 \(2\) 位字符 "zb" 向右移动 \(3\) 位,\(s\) 变为 "cecde";

再将 "cecde" 的前 \(3\) 位字符 "cec" 向左移动 \(5\) 位,\(s\) 变为 "xzxde";

再将 "xzxde" 的前 \(4\) 位字符 "xzxd" 向右移动 \(7\) 位,\(s\) 变为 "egeke";

再将 "egeke" 的前 \(5\) 位字符 "egeke" 向左移动 \(9\) 位,\(s\) 变为 "vxvbv"。

最后,将操作完成后的字符串 "vxvbv" 输出。

样例输入:

5
abcde
1 3 5 7 9

样例输出:

vxvbv

解题思路:

首先看数据量,发现这道题的数据量特别大,如果暴力的话肯定是会 TLE 的(亲测,暴力可以拿到 \(36\%\) 的高分。考虑按照以下方法优化:

注意到对于字符串的第 i 个字符,在完全模拟的过程中会调整 \(n - i + 1\) 次。但事实上,我们只需要记录某一个字符最终的偏移量就好了。参考样例,a 字符在经过 -1, +3, -5, +7, -9 (ASCII 码位移)后,最终只会偏移 -5 位。我们只需要记录每一位的最终偏移量就好了。

为了优化算法,考虑使用差分的策略来进行区间位移的操作。具体代码如下(整解,但因数据问题无法 AC):

image

备注:记得开 int,开 long long 不拿分。

T5 - 通关游戏的最少能量值。

题干描述:

有一款新游戏,通关这个游戏需要完成 \(n\) 个任务,这 \(n\) 个任务可按任意次序完成。每个任务设置了启动能量值和完成任务消耗的能量值,且消耗的能量值小于等于该任务的启动能量值。如果玩家当前的能量值低于该任务启动能量值,则不能开始该任务。

例 1:玩家当前的能量值为 \(7\),当前任务的启动能量值为 \(5\),完成任务消耗的能量值为 \(3\),则可以开始该任务,完成任务后玩家剩余能量值为 \(4\)

例 2:玩家当前的能量值为 \(5\),当前任务的启动能量值为 \(8\),则无法开始该任务。

游戏开始时玩家需要一个初始能量值用来完成这 \(n\) 个任务。当给定每个任务的启动能量值和完成任务消耗的能量值时,请问初始能量的最小值是多少?

样例输入:

3
2 2
9 5
7 4

样例输出:

12

解题思路: 考虑使用二分+贪心的策略。首先用贪心算法求得一个最优的打怪顺序。在这里,我们可以按照打完怪兽的剩余血量对数组进行排序。之后二分答案判断以 mid 为初始血量是否可以打完所有的怪物即可。

T6 - 物品分组

巧了,洛谷原题。我在 \(N\) 年前做过这道题目。链接:P1182 数列分段

数列分段 Section II

题目描述

题干描述: 对于给定的一个长度为 \(N\) 的正整数数列 \(A_{1\sim N}\),现要将其分成 \(M\)\(M\leq N\))段,并要求每段连续,且每段和的最大值最小。

样例输入:

5 2
6 1 3 8 4

样例输出:

12

解题思路: 也是一道很经典的二分答案题目,二分判断当每一段的和最大为 mid 时,是否可以分成 \(m\) 段即可。check 函数也是比较好写的。

#include <iostream>
#include <algorithm>
using namespace std;int n, m;
int l, r, ans;
int arr[100005];// 判断当每一段的和最大为 mid 时,是否可以分成 m 段。
bool check(int mid){int cut=1, current=0;for (int i=0; i<n; i++){if (current + arr[i] <= mid){current += arr[i];} else{current = arr[i];cut++;}}return cut <= m;
}int main(){cin >> n >> m;int total=0;for (int i=0; i<n; i++){cin >> arr[i];r += arr[i];l = max(l, arr[i]);}while(l <= r){int mid = (l+r)/2; if(check(mid)){r = mid - 1;ans = mid;} else l = mid + 1;}cout << l << endl;return 0;
}

本帖只提供六道编程题的解题思路,部分题目并不提供实际的代码(因为我赛时忘记把代码截图下来了)。

T1 - 看书

题干描述: 一本书共 \(n\) 页,小明计划第一天看 \(x\) 页,此后每一天都要比前一天多看 \(y\)
页,请问小明几天可以看完这本书?

输入格式: 一行输入三个整数 \(n\)\(x\)\(y\) \((20\le n\le 5000,1\le x,y\le 20)\),分别表示书的总页数、计划第一天看的页数以及此后每天都要比前一天多看的页数,整数之间以一个空格隔开。

输出格式: 输出一个整数,表示小明几天可以看完这本书。

样例输入:100 10 5

样例输出:5

解题思路: 防爆零题。用一个 while 循环来判断还有多少页的书需要看,循环里拿一个变量来记录循环次数作为答案即可。

T2 - 数字交换

题干描述: 给定一个正整数 \(n\),请将 \(n\) 的最高位与最低位的数字进行交换,并输出交换后的结果。如果交换后的结果有前导 \(0\),去除前导 \(0\) 后再输出结果。

输入描述: 输入一个正整数 \(n (100\le n\le10^9)\)

输出描述: 输出答案。

样例输入: 173

样例输出: 371

解题思路: 以字符串的形式来读入字符,先用 C++ 自带的 swap 交换该字符串的第一位和最后一位。之后用 while 循环记录第一个合法数字出现的位置(即删除前导零)。最后用 string 类的 .substr() 方法截取字符串有效子串。

T3 - 出现奇数次的数

题干描述: 给定 \(n\) 个整数,其中只有一个数出现了奇数次,请找出这个数。

输入格式:

第一行输入一个整数 \(n (1\le n \le 10^5)\)
第二行输入 \(n\) 个整数 \((1\le 整数\le 10^9)\),整数之间以一个空格隔开(数据保证只有一个数出现了奇数次)

输出格式: 输出一个整数,表示出现了奇数次的数。

样例输入:

7
6 2 4 6 4 2 6

样例输出:

6

解题思路:

这道题可以有多种算法来解。一种方法是使用 sort 函数对数组排序,然后找出某个出现奇数次的数即可。还可以用 STL 的 map 数据结构,类似桶排序的方法,来记录某一个键出现的次数,最后扫一遍就可以找出来了。

最方便的做法是使用异或的性质来快速找到某个出现奇数次的数。具体地,将数组中的所有元素依次进行异或运算,最终结果就是唯一一个出现奇数次的数,因为出现偶数次的数都会在异或中抵消掉。

代码展示:

#include <iostream>
using namespace std;int main(){int n, t, ans = 0;cin >> n; while(n--){cin >> t;ans ^= t;}cout << ans << endl;return 0;
}

T4 - 字母移位

这道题是我觉得整一场比赛中最有问题的题目了。开了 long long 过不了,不开 long long 不取模竟然是过得了的。这证明这道题的数据是有问题的。(一个半小时的考试,这道题浪费了我一个小时的调试时间。我只能说,出题组太垃圾了)。

题干描述:

字母移位:表示将字母按照字母表的顺序进行移动。

例如:'b' 向右移动一位是 'c',“向左移动两位是 'd'。

特别地,'a' 向左移动一位是 'z','z' 向右移动一位是 'a'。

给定一个仅包含小写字母且长度为 \(n\) 的字符串 \(s\),以及 \(n\) 个正整数 \(a_1, a_2, \dots, a_n\),接下来对字符串 \(s\) 按如下规律操作:

  1. 将第 \(1\) 位字符向左移动 \(a_1\) 位;
  2. 再将第 \(1、2\) 位字符都向右移动 \(a_2\) 位;
  3. 再将第 \(1、2、3\) 位字符都向左移动 \(a_3\) 位;
  4. 再将第 \(1、2、3、4\) 位字符都向右移动 \(a_4\) 位;

以此类推,直到将 \(s\) 的第 \(1\) 到第 \(n\) 位字符都(按规律向左或向右)移动完毕。

最后,将操作完成后的字符串 \(s\) 输出。

例如:\(n = 5\),字符串 s = "abcde",\(5\) 个正整数为 1, 3, 5, 7, 9;

将 "abcde" 的第 \(1\) 位字符 "a" 向左移动 \(1\) 位,\(s\) 变为 "zbcde";

再将 "zbcde" 的前 \(2\) 位字符 "zb" 向右移动 \(3\) 位,\(s\) 变为 "cecde";

再将 "cecde" 的前 \(3\) 位字符 "cec" 向左移动 \(5\) 位,\(s\) 变为 "xzxde";

再将 "xzxde" 的前 \(4\) 位字符 "xzxd" 向右移动 \(7\) 位,\(s\) 变为 "egeke";

再将 "egeke" 的前 \(5\) 位字符 "egeke" 向左移动 \(9\) 位,\(s\) 变为 "vxvbv"。

最后,将操作完成后的字符串 "vxvbv" 输出。

样例输入:

5
abcde
1 3 5 7 9

样例输出:

vxvbv

解题思路:

首先看数据量,发现这道题的数据量特别大,如果暴力的话肯定是会 TLE 的(亲测,暴力可以拿到 \(36\%\) 的高分。考虑按照以下方法优化:

注意到对于字符串的第 i 个字符,在完全模拟的过程中会调整 \(n - i + 1\) 次。但事实上,我们只需要记录某一个字符最终的偏移量就好了。参考样例,a 字符在经过 -1, +3, -5, +7, -9 (ASCII 码位移)后,最终只会偏移 -5 位。我们只需要记录每一位的最终偏移量就好了。

为了优化算法,考虑使用差分的策略来进行区间位移的操作。具体代码如下(整解,但因数据问题无法 AC):

备注:记得开 int,开 long long 不拿分。

T5 - 通关游戏的最少能量值。

题干描述:

有一款新游戏,通关这个游戏需要完成 \(n\) 个任务,这 \(n\) 个任务可按任意次序完成。每个任务设置了启动能量值和完成任务消耗的能量值,且消耗的能量值小于等于该任务的启动能量值。如果玩家当前的能量值低于该任务启动能量值,则不能开始该任务。

例 1:玩家当前的能量值为 \(7\),当前任务的启动能量值为 \(5\),完成任务消耗的能量值为 \(3\),则可以开始该任务,完成任务后玩家剩余能量值为 \(4\)

例 2:玩家当前的能量值为 \(5\),当前任务的启动能量值为 \(8\),则无法开始该任务。

游戏开始时玩家需要一个初始能量值用来完成这 \(n\) 个任务。当给定每个任务的启动能量值和完成任务消耗的能量值时,请问初始能量的最小值是多少?

样例输入:

3
2 2
9 5
7 4

样例输出:

12

解题思路: 考虑使用二分+贪心的策略。首先用贪心算法求得一个最优的打怪顺序。在这里,我们可以按照打完怪兽的剩余血量对数组进行排序。之后二分答案判断以 mid 为初始血量是否可以打完所有的怪物即可。

T6 - 物品分组

巧了,洛谷原题。我在 \(N\) 年前做过这道题目。链接:P1182 数列分段

数列分段 Section II

题目描述

题干描述: 对于给定的一个长度为 \(N\) 的正整数数列 \(A_{1\sim N}\),现要将其分成 \(M\)\(M\leq N\))段,并要求每段连续,且每段和的最大值最小。

样例输入:

5 2
6 1 3 8 4

样例输出:

12

解题思路: 也是一道很经典的二分答案题目,二分判断当每一段的和最大为 mid 时,是否可以分成 \(m\) 段即可。check 函数也是比较好写的。

#include <iostream>
#include <algorithm>
using namespace std;int n, m;
int l, r, ans;
int arr[100005];// 判断当每一段的和最大为 mid 时,是否可以分成 m 段。
bool check(int mid){int cut=1, current=0;for (int i=0; i<n; i++){if (current + arr[i] <= mid){current += arr[i];} else{current = arr[i];cut++;}}return cut <= m;
}int main(){cin >> n >> m;int total=0;for (int i=0; i<n; i++){cin >> arr[i];r += arr[i];l = max(l, arr[i]);}while(l <= r){int mid = (l+r)/2; if(check(mid)){r = mid - 1;ans = mid;} else l = mid + 1;}cout << l << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记-气象雷达波段简介

“雷达”一词源自英文Radar(radio detection and ranging),表示无线电探测和测距。 雷达是主动遥感仪器。雷达发射电磁波,然后接受探测粒子散射的电磁波,通过分析返回电磁波信号的时间、位相、频率、强度等的变化,来对粒子的位置、速度、状态等信息进行探测。 由于不同粒子…

Max–min 不等式,KTT 条件,以及不等式的对偶形式

嚙踝蕭嚙踝蕭打打だいず - Worlds end loneliness 打打 的 音 色太 具 代 表性 而且在这么高的 BPM 还能表达出清晰的感情,真乃神曲 . 依旧是笑林广记: 老僧往后园出恭,误被笋尖搠入臀眼,乃唤疼不止。小沙弥见之,合掌云:“阿弥陀佛,天报。” 在三次互反律证明之前发现有…

052205144张诗悦

这个作业属于哪个课程 软件工程这个作业要求在哪里 作业要求这个作业的目标 熟练使用AIGC 博客园 markdown,对课程的有一个清晰规划学号 052205144一、个人logo文生图任务 1.使用免费的AIGC图像生成工具为我的Github和博客园账号创建一个独特的个人Logo。使用工具:[豆包](豆…

论文速读纪录 - 202408

新鲜出炉的八月份论文阅读记录特别鸣谢kimi,以下论文均在kimi辅助下阅读。 目录RMIB: Representation Matching Information Bottleneck for Matching Text Representations AttentionRank: Unsupervised keyphrase Extraction using Self and Cross Attentions ANSWERING COM…

Redis 入门 - 简介

如何学习Redis,如何快速入门,相信Redis入门系列可以给你提供帮助。Redis是Remote Dictionary Server的缩写,可以翻译成远程字典服务。Redis是用C语言编写的开源项目。 Redis 最主要的特点就是高性能,对于简单的键值读取速度可以达到100000次/s,在理想情况下简单的键值写入…

2024软件工程博客园第一次作业

这个作业属于哪个课程 首页 - 软件工程2024 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)这个作业要求在哪里 2024秋软件工程个人作业(第一次) - 作业 - 软件工程2024 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 搭建自己的博客,写下自己的个人情况和愿景学号 1022…

不可不知的WPF形状(Shape)

在WPF开发中经常需要进行绘制图形,可以利用Shape类型绘制基本的形状,而且Shape派生自FrameworkElement,属于UI元素范畴,可以直接利用XAML进行绘制。本文通过一些简单的小例子,简述如何通过Shape类绘制形状,仅供学习分享使用,如有不足之处,还请指正。在WPF开发中经常需要…

软件工程第一次个人作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标 学会使用Aigc工具生成个人logo,搭建github个人网站,并熟悉markdown编辑,进行自我知识和技能评估学号 1022011…

日本出行

必备飞机 https://www.bilibili.com/video/BV1RC411J7tf/ 前3分钟 南航 全日空航空 出行公交卡(西瓜卡,首充1000 711消费完) 车次 15:42 https://www.bilibili.com/video/BV1j64y1A7x1/ 车次 13:24 https://www.bilibili.com/video/BV1RC411J7tf pasmo卡(只支持地铁,不支持…

智慧环卫:城市清洁的未来图景与技术革新

在智慧城市的宏伟蓝图中,“智慧环卫”正以其独特的姿态,悄然改变着城市的清洁与环境卫生管理方式。智慧环卫不仅仅是技术的简单应用,更是城市管理智慧化、生态化的重要体现。本文旨在深入探讨智慧环卫的内涵、技术支撑、实践案例及对城市环境改善的深远影响。智慧环卫:定义…

AWC 批量查询使用关系的最新版本并导出Excel

1.查询使用关系的方法:* 调用查询返回数据* @param {Object} data* @returns {Promise}* */ export let queryItemRevisionById = function (data) {if (!data.item_id) {messagingService.showInfo("请输入查询条件");return;}var item_id=data.item_id.dbValue.re…

Docker 简介

首先说明一些特性:一个容器中只有一个主进程,遵循单一原则,否则一个容器挂了会导致多个进程挂掉;容器其实就是一个进程,docker可以管理这些进程。docker能够进行容器隔离,我们操作的其实是docker客户端,而不是server端。 docker info # 查看docker信息docker基本概念 doc…