自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 Visual Studio报错“bool”未定义的标识符解决方案

【摘要】在C语言编译环境下使用bool类型会报错,因为bool是C++关键字而非C语言关键字。解决方案有三种:1)引入stdbool.h头文件(通过宏定义实现bool);2)直接使用C语言的_Bool类型;3)(推荐)修改项目配置,将编译选项改为C++代码(/TP)。其中stdbool.h头文件通过宏定义将bool映射为_Bool类型,false/true映射为0/1,从而在C语言中实现类似C++的布尔类型功能。

2025-08-24 14:17:06 582

原创 C++逆序对数目的求解

本文介绍了求解逆序对数的两种算法:基于冒泡排序的O(n²)方法和基于归并排序的O(nlogn)方法。冒泡排序通过交换相邻元素统计逆序对,而归并排序在合并过程中计算跨区间的逆序对。测试结果显示归并排序在效率上显著优于冒泡排序,5个测试点均快速通过,最高仅用时6ms。该算法适用于需要高效计算逆序对数的场景,如CSP-S2021等编程竞赛。

2025-08-23 02:19:57 329

原创 C++高效的质数的判断(2种方法)

本文介绍了质数的基本概念和判断方法。首先定义质数为仅能被1和自身整除的正整数,并指出质数分布的稀疏性。重点讲解了试除法判断质数的方法,通过优化可将检测范围缩小至√N。文章还介绍了更高效的Miller-Robbin算法,该算法基于费马小定理,通过随机测试提高判断准确性,但需注意卡迈克尔数等特殊情况。最后提及了快速幂计算和区间质数筛法,为后续内容埋下伏笔。文章结合数学证明和代码示例,深入浅出地讲解了质数判断的不同方法及其优化思路。

2025-08-23 02:06:19 905

原创 C++ 监视用户输入的数据(键盘钩子)代码及详解

本文介绍了如何在C++控制台程序中实现全局键盘钩子。关键点在于使用WH_KEYBOARD_LL参数(而非WH_KEYBOARD)来捕获所有程序的按键事件。文章附带了一个DevC++示例代码,通过SetWindowsHookEx设置低级键盘钩子,在按键时输出时间戳和按键字符。同时解释了WH_KEYBOARD_LL与WH_KEYBOARD的区别,指出前者能捕获系统全局按键,后者仅限当前进程。代码实现了简单的按键记录功能,包括获取系统时间并打印按键信息。

2025-08-23 02:05:38 292

原创 1358:中缀表达式值(expr)(一本通)

题目要求处理中缀表达式,先判断合法性(括号匹配、运算符位置等),合法则转为后缀表达式求值。程序使用双栈(数字栈和运算符栈)实现,包含表达式合法性检查、运算符优先级处理和运算执行。测试样例输入"1+2*8-9@",输出结果8。程序通过5个测试点,运行时间4-7ms,内存416-428KB。核心算法参考了T1356题解,但增加了合法性检查功能。

2025-08-23 02:05:18 389

原创 1357:车厢调度(train)(一本通栈的使用)

摘要:题目描述一个火车车厢调度问题,通过栈结构模拟车厢进出过程。给定n节车厢(n≤1000)和目标顺序,判断能否通过栈操作实现。输入为n和序列,输出"YES"或"NO"。样例输入5和54321时输出YES。提示指出该问题本质是栈的合法出栈顺序判断,并提供了优化解法代码,使用数组模拟栈操作,通过比较栈顶元素实现高效验证。测试结果显示程序在所有测试点均正确通过。

2025-08-23 02:05:04 602

原创 C++各种排序方法讲解(基础)

本文介绍了12种常见排序算法,包括比较类排序(如冒泡、选择、插入、快速、归并排序等)和非比较类排序(如基数、计数、桶排序)。重点分析了冒泡、选择、插入、计数、归并和快速排序的C++实现代码,其中快速排序在平均情况下效率最优。文章还提供了排序算法的分类参考和时间空间复杂度分析,并附有相关技术博客链接供深入阅读。

2025-08-23 02:04:28 303

原创 C++经典的对拍程序与方法

本文介绍了在Windows系统中进行程序对拍的方法,用于验证正解程序的正确性。具体步骤包括:1)编写朴素算法BF.cpp和正解程序True.cpp;2)创建随机数据生成程序Rand.cpp;3)准备数据文件和输出文件;4)编写Process.cpp控制程序,通过system函数调用各组件并比较输出结果。文章详细说明了fc文件比较指令的使用、clock()计时函数的应用以及freopen文件重定向操作的注意事项,并提供了各程序模板。该方法适用于竞赛编程中对程序正确性的自动化验证。

2025-08-23 02:04:06 396

原创 C++快速幂详解

快速幂算法通过位运算优化计算过程,相比朴素方法显著提升效率。其核心思想是将指数b分解为二进制形式,通过平方操作减少乘法次数。代码实现中利用b>>=1和b&1进行位运算判断,同时每一步都对结果取模防止溢出。该方法尤其适用于大数计算,能有效处理a^b%p问题,避免数据范围超限。两种方法对比显示,快速幂在时间和空间复杂度上全面优于朴素算法。

2025-08-23 02:03:18 436

原创 C++各种排序方法讲解(进阶)

本文展示了C++中堆排序和希尔排序的两种实现方式。堆排序部分包含两种方法:第一种通过逐个插入元素构建堆,第二种从数组中间开始调整构建堆。希尔排序部分也提供了两种实现:第一种使用三重循环进行分组插入排序,第二种通过动态调整间隔进行排序。代码示例详细展示了每种排序算法的具体实现过程,包括元素交换和堆/数组调整的步骤。这些实现虽然方法不同,但都能正确完成排序功能,为理解排序算法提供了实用参考。

2025-08-23 00:39:08 325

原创 C++ Catrix游戏引擎开发之全屏,无边框,窗口模式切换逻辑(适用于OpenGL接口)

本文分享了使用GLFW开发游戏窗口模式切换功能的技术细节,主要实现了全屏、无边框和窗口三种模式的相互转换。作者在开发Catrix游戏引擎过程中,将窗口切换逻辑从主引擎中剥离,形成可独立运行的代码示例。文章详细介绍了关键的GLFW函数,包括获取/设置窗口属性、显示器信息等,并提供了完整的实现代码。通过F1-F3按键可切换不同显示模式,背景色会随模式变化。文中还特别指出了两个常见的编程陷阱:窗口位置数据丢失和属性设置顺序问题,并给出了解决方案。该项目已在GitHub开源,但文档尚待完善。

2025-08-23 00:20:36 1257

原创 1356:计算(calc)(一本通)使用栈解法

这是一道关于表达式求值的算法题,要求计算包含加减乘除、指数和括号的整数运算。题目采用栈结构实现,通过运算符优先级处理(^ > / > +-)和括号匹配来完成计算。代码使用两个栈分别存储数字和运算符,当遇到更高优先级运算符时先处理栈内运算。输入样例"1+(3+2)(7^2+6*9)/(2)"正确输出258。该解法在5个测试点均快速通过,内存占用约424-436KB,时间3-6ms,适用于CSP-S竞赛准备。后续还会补充表达式树解法。

2025-08-22 01:33:42 327

原创 1184:明明的随机数(一本通)(归并与桶排序的比较)

题目要求将合影人员按特定规则排序:男生全部在左,按身高升序排列;女生全部在右,按身高降序排列。输入包含人数n(2≤n≤40)和每个人的性别与身高数据,输出排序后的身高序列(保留2位小数)。 示例代码使用快速排序分别处理男生和女生数组,男生正序输出,女生倒序输出。测试结果显示程序在所有测试点均正确运行,平均内存占用约470KB,时间在3-6ms之间。关键点在于正确处理性别分组和排序方向。

2025-08-22 01:28:46 349

原创 1182:合影效果(一本通题解)(快排)

题目要求将合影队伍按特定规则排序:男生(male)在左按身高升序排列,女生(female)在右按降序排列。输入人数n(2≤n≤40)及每个人的性别和身高,输出排序后的身高序列(保留2位小数)。给出的C++代码通过快速排序实现了该功能,将所有男生和女生分别存储在两个数组中,男生数组升序排序,女生数组降序排序后输出。测试结果显示程序在所有测试点均正确通过,运行效率较高(内存472-480KB,时间3-6ms)。

2025-08-22 01:25:52 387

原创 KMP算法详解与实现(C++)

本文介绍了字符串匹配的三种算法:纯暴力匹配、暴力优化和KMP算法。前两种算法通过双重循环实现匹配,效率较低。KMP算法利用next数组记录子串前缀信息,通过预处理模式串实现高效匹配。next数组的构建是KMP的核心,它避免了主串指针回溯,将时间复杂度优化至O(n+m)。文章简要说明了各算法思路,并着重强调了KMP算法中next数组的作用和重要性。

2025-08-22 01:11:40 276

原创 P4943 密室(Dijkstra+堆优化)

本文基于《哈利波特与密室》改编的算法题目,描述哈利和罗恩在由n个小室组成的密室中寻找两个目标点的最短路径问题。部分小室只有哈利能进入。输入包括小室数量、通道数、限制小室数及具体信息,输出两人到达目标点的最短时间。算法使用Dijkstra分别计算哈利和罗恩到两个目标点的路径,并比较三种可能方案的最优解:两人分头行动或一人先到一个点再去另一个点。最终结果取三种方案中的最小值。代码通过优先队列实现Dijkstra算法,处理不同访问限制条件下的最短路径计算。

2025-08-22 01:11:12 162

原创 P7076 [CSP-S2020] 动物园(位运算的应用)

本文研究了n×m网格图的最小生成树问题。网格中横向边权值为行数组a,纵向边权值为列数组b。算法核心思想是:对a和b数组排序后,每次选择当前最小权值的边(横向或纵向),同时计算剩余可连接的点数。时间复杂度为O(n log n + m log m)。通过动态维护已连接的横向和纵向边数,确保每次选择最优边,最终得到最小生成树的总权值。代码实现简洁高效,适用于大规模网格图。

2025-08-22 01:10:33 327

原创 P7076 [CSP-S2020] 动物园(位运算的应用)

这道题目考察位运算和逻辑分析能力。给定动物园中动物的编号和饲养要求,要求计算在不改变当前饲料清单的情况下,还能饲养多少种新动物。关键点在于分析未被使用的二进制位,通过位运算确定哪些动物编号可以被添加。当k=64且无限制位时,结果会超出unsigned long long范围,需要特殊处理。算法复杂度为O(n+m),能高效处理大规模数据。

2025-08-22 01:10:14 622

原创 P7074 [CSP-J2020] 方格取数

摘要:该问题要求在n×m的方格图中,从左上角到右下角寻找一条路径,使得路径上的数字之和最大。移动规则为每次只能向上、向下或向右走一格,不能重复经过或越界。使用动态规划方法,通过维护三个数组(up、down、f)来计算每列的最优解。最终在最后一列比较所有可能路径的和,输出最大值。样例1的输出结果为9,样例2为-10。代码实现了该算法,时间复杂度为O(nm)。

2025-08-22 01:09:49 291

原创 P5686 [CSP-S2019 江西] 和积和

题目要求计算两个序列a和b所有子区间乘积之和,即S(l,r)=sum(a[l..r])*sum(b[l..r])的总和。解法利用前缀和数组prea和preb分别存储a和b的前缀和。通过巧妙变形,将原问题转化为计算总和的线性组合,避免了O(n^2)的暴力计算。关键步骤包括: 预处理前缀和数组 计算ans=sum(prea[i]prebi) 计算temp1=sum(prea[i])和temp2=sum(temp1*preb[i]) 最终结果为(ans-temp2) mod 1e9+7 该方法将时间复杂度优化至O

2025-08-22 01:08:40 229

原创 KMP算法代码

本文介绍了KMP字符串匹配算法的核心实现,重点讲解next数组的构建过程。next数组通过预处理模式串,记录部分匹配信息以优化匹配效率。算法实现分为两个主要部分:首先建立next数组进行模式串预处理;然后在主串匹配过程中利用next数组进行指针回溯,避免重复比较。提供了完整的C语言实现代码,包含详细注释说明回溯原理(如j=-1时的处理)和匹配流程。该算法的时间复杂度为O(n+m),相比朴素匹配算法效率显著提升。

2025-08-22 01:08:27 181

原创 P7243 最大公约数 (BFS的应用)

【摘要】题目描述了一个n×m矩阵中元素的动态变化过程:每天每个元素变为自身与相邻四个元素的最大公约数。给定初始矩阵和特定位置(x,y),要求计算该位置元素首次变为1所需的最少天数,若无法变为1则输出-1。解题思路采用BFS广度优先搜索,从目标点出发逐步扩展搜索范围,在每次迭代中计算当前区域所有元素的GCD,若发现结果为1则立即返回当前天数。算法使用循环队列优化空间效率,并通过预处理检查初始值是否为1来优化特殊情况。

2025-08-22 01:08:05 375

原创 P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

摘要:该问题要求将n堆不同数量的果子合并为一堆,每次合并两堆消耗的体力等于两堆重量之和,求最小体力消耗。解决方法是使用优先队列(最小堆)每次合并最小的两堆,重复直到只剩一堆。示例输入3堆果子(1、2、9),最小体力消耗为3+12=15。代码实现使用优先队列高效处理合并过程,时间复杂度为O(nlogn)。适用于n≤10000的情况,保证结果小于2^31。

2025-08-22 01:07:52 288

原创 P1040 [NOIP2003 提高组] 加分二叉树题解(动态规划)

摘要:给定节点数为n的二叉树中序遍历序列(1,2,...,n),每个节点有分数di。计算加分值:非空子树加分为左子树加分×右子树加分+根节点分数,空子树加分为1。要求构造加分最高的二叉树,输出最高加分和前序遍历序列。使用动态规划,通过二维数组记录区间最优解和根节点位置,最终输出结果。时间复杂度O(n^3),适用于n≤30的情况。

2025-08-22 01:07:38 156

原创 T196684 昕昕的不等式组(洛谷EVOI CSP信心赛)

题目要求解由n个一元一次不等式组成的不等式组的解集。每个不等式已经化简为x与常数的比较形式(如x>t或x≤t)。需要找出所有不等式解集的交集,并按特定格式输出结果。若无解则输出"NoAnswer!"。 解题思路是:对于x>t或x≥t类不等式,记录最大的t值;对于x<t或x≤t类不等式,记录最小的t值。最后比较这两类边界值,若存在重叠区间则输出解集,否则判定无解。 程序处理输入时,逐个解析不等式,更新上下界。最终根据边界情况判断解集是否存在,并按要求格式输出结果。

2025-08-22 01:07:27 904

原创 P7113 [NOIP2020] 排水系统 (DFS)(90Point简易算法)

该题目描述了一个城市的排水系统,要求计算每个最终排水口排出的污水量。系统由n个节点和m个污水接收口组成,污水从接收口流入后经过管道分流,最终到达无排出管道的最终排水口。输入给出节点间的管道连接关系,输出要求用分数形式表示各最终排水口的污水量,需约分至最简。 解题思路: 使用DFS遍历排水系统 对每个节点的污水量进行分数形式的计算和传递 在分流时进行分数运算和约分 最终输出无排出管道节点的污水量分数 关键点: 分数运算时要注意约分,避免溢出 需要考虑大数运算(原代码因unsigned long long范围限

2025-08-22 01:07:12 713

原创 P5020 [NOIP2018 提高组] 货币系统

摘要:题目要求简化货币系统,找到与原系统等价但面额种类最少的系统。给定n种面额,通过动态规划判断哪些面额能被其他面额组合表示,从而确定最小m值。核心思路是筛选出不能被其他面额线性组合表示的面额,这些面额构成简化后的系统。输入输出样例展示了如何通过排除冗余面额来最小化m。算法需处理多组数据,时间复杂度取决于面额大小和数量。

2025-08-22 01:06:53 515

原创 CSP-J-2020-优秀的拆分多种解法

本文介绍了正整数"优秀拆分"的定义和求解方法。优秀拆分要求将正整数n拆分为不同的2的正整数次幂之和。文章给出了两种解决方案:1)位运算方法,通过从大到小枚举2的幂次进行拆分;2)DFS深度优先搜索方法。关键点在于判断n是否为偶数且大于1,否则输出-1。对于符合条件的n,位运算方法更高效,而DFS方法在小数据规模下也可行。文章提供了两种方法的代码实现,并解释了其逻辑思路。

2025-08-22 01:06:28 354

原创 C++数组的高级使用用法(下标可以为负数?)

本文探讨了C++数组的底层原理和特殊用法。作者指出数组本质上是连续内存空间的指针,并介绍了三种访问数组元素的方式:常规下标法、不常见的(下标)[数组名]写法,以及指针偏移法*(数组名+下标)。特别分析了数组下标为负数的情况,说明这会访问未知内存区域导致不可预测结果,同时解释了负数下标运算时的语法优先级问题。文章强调数组大小不能为负数,并提醒读者注意指针操作的安全性。

2025-08-22 01:05:53 487

原创 C++区间质数筛选(2种方法)

本文介绍了两种C++实现区间质数筛选的方法:埃拉托斯特尼筛法和线性筛法。埃拉托斯特尼筛法通过标记倍数来筛选质数,时间复杂度为O(NloglogN),但存在重复标记问题。优化版本从i²开始标记可减少冗余计算。线性筛法则通过最小质因子保证每个合数只被标记一次,时间复杂度优化至O(N)。文章通过代码示例和图示对比了两种算法的实现原理和效率差异,指出线性筛法是更优选择。两种方法都能有效筛选出给定区间[min,max]内的所有质数。

2025-08-22 01:05:32 375

原创 C++求一元二次方程方程的根(C++的精确度问题)

本文讨论了C++中求解一元二次方程时浮点数精度问题带来的错误。通过例题分析指出,直接用==比较浮点数会导致错误,因为十进制到二进制的转换存在精度损失。作者建议使用近似值比较法(如1e-6作为精度阈值)来避免等号判断,并给出了正确的实现代码。关键点在于:当判别式绝对值小于精度阈值时视为0,大于阈值时按正常情况处理。这种方法保证了结果精确到小数点后5位的要求。

2025-08-22 01:05:04 597

原创 表达式(CSP-J 2021-Expr)题目详解

该题解介绍了一种处理逻辑表达式的高效算法。题目要求处理后缀表达式形式的逻辑运算(与、或、非),并快速查询修改某个变量后的表达式结果。作者采用树形结构存储表达式,通过两次深度优先遍历实现快速查询:第一次自底向上计算各节点默认值,第二次自顶向下预处理每个节点在两种状态(0/1)时的结果。这种方法避免了每次查询时重新计算整个表达式,将查询时间优化至O(1)。关键点在于利用指针动态建树,并通过dp数组存储每个节点的两种可能结果。最终算法的时间复杂度为O(n+q),能高效处理大规模查询。

2025-08-21 18:01:00 1232

原创 纯C语言绘制动态三维圆

这段C语言代码展示了如何在Windows控制台窗口中绘制动态旋转的3D球体。通过调用Windows API的图形函数,代码实现了在控制台窗口绘制3D线框球体的效果。主要使用了数学计算生成球面顶点坐标,并通过旋转矩阵实现动态旋转效果。代码需要链接gdi32库,创建兼容位图进行双缓冲绘制以避免闪烁,最终将结果输出到控制台窗口。该示例突破了传统C/C++控制台程序只能输出字符的限制,展示了在控制台窗口实现图形绘制的可能性。

2025-08-21 17:56:47 209

原创 动态规划-01背包问题通俗详解

本文介绍了01背包问题的动态规划解法。给定背包容量M和N件物品的重量、价值,要求计算能获得的最大总价值。核心思路是使用二维数组dp[i][j]记录前i件物品在容量j时的最大价值。通过状态转移方程进行比较:若当前物品能装入,则比较装入前后的价值;否则保持原值。初始化dp[0][j]=0,最终结果存储在dp[N][M]中。文末给出了完整C++代码示例,并指出该方法通过记忆子问题解避免了重复计算,相比暴力解法更高效。

2025-08-21 17:50:16 382

原创 回文(CSP-S-2021-palin)题解

题目要求判断给定整数序列是否能通过两端取数操作构成回文序列,并输出字典序最小的操作方案。解题核心思路是:优先选择左端元素(L),同时从序列两端向内匹配成对的相同数字。若无法匹配则尝试右端方案(R),仍不成立则输出-1。关键点在于需要同时处理序列内外层,确保每一步操作都满足回文条件,并维护字典序最小原则。最终操作序列的末尾必须为L以保证字典序最小。代码通过双指针模拟取数过程,并详细处理了四种可能的匹配情况。特别提醒要注意字符串终止符的处理,避免输出残留字符。

2025-08-21 17:42:55 1116

原创 回文数(Noip1999)题解

该题目要求判断给定N进制数M通过反复与自身逆序数相加,最少需要多少步能得到回文数(最多30步)。程序首先将输入字符串转换为数组表示,然后通过循环进行回文判断和N进制加法操作。每次迭代检查是否为回文,若30步内未得到回文则输出"Impossible"。核心处理包括:数字转换、回文检查、N进制加法(处理进位)及步数控制。代码中虽存在调试输出语句,但整体逻辑清晰,通过逐步相加和进位处理实现题目要求。

2025-08-21 17:35:22 167

原创 廊桥分配(CSP-S-2021-T1)通俗题解

文章摘要:题目描述如何分配有限廊桥给国内和国际航班,使停靠廊桥的飞机数量最大化。提出两种解法:1) 朴素贪心法,分别计算不同分配方案下的停靠数量,时间复杂度较高;2) 优化方法,通过优先编号和动态规划思想减少冗余计算。给出了两种方法的代码实现,其中优化方法利用set容器和迭代器处理航班排序,但部分测试用例仍存在问题。最终通过比较不同分配方案得出最优解。

2025-08-21 17:24:18 830

原创 裴蜀定理(Noi Color)应用

题目摘要:给定整数p1,p2,k,要求对编号格子的倍数染色(p1倍数染红,p2倍数染蓝,公共倍数可任选),判断是否存在染色方案使得没有k个连续同色格。通过数学分析将问题转化为求互质数a,b的最大连续红色区间,若(b-1)/a的上取整<k则输出"Yes",否则"No"。

2025-08-21 17:15:05 920

原创 前缀和(一维,二维)的讲解与应用

本文介绍了前缀和在区间求和中的应用。一维前缀和通过预处理数组S,使得区间[l,r]的和可用S[r]-S[l-1]快速计算,相比传统方法更高效。二维前缀和则通过公式S[x][y]=S[x-1][y]+S[x][y-1]-S[x-1][y-1]+a[x][y]预处理,支持快速计算任意矩形区域和。对于查询(x1,y1)到(x2,y2)的矩形区域,使用公式S[x2][y2]-S[x1-1][y2]-S[x2][y1-1]+S[x1-1][y1-1]求解。文章通过代码示例和图示详细说明了两种前缀和的应用方法。

2025-08-21 17:12:14 635

原创 求回文串(洛谷P5041 HAOI2009) 题解

这篇题解讨论如何将给定字符串通过最少交换相邻字符变为回文串。首先判断可行性:当超过1个字符出现奇数次时直接返回-1。可行情况下,采用贪心策略构造目标回文串的下标数组:从左到右匹配相同字符的最右位置,未被匹配的中间字符(若有)置于中间。最后通过归并排序计算该下标数组的逆序对数,即为最少交换次数。时间复杂度为O(nlogn),适用于大长度字符串。

2025-08-21 16:59:51 542

War of Plane(飞机大战)(Python Pygame制作)

该作品为pygame制作的2D小游戏飞机大战,主角操纵飞机来击败敌人,飞机有多种射击方式。

2024-10-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除