- 博客(667)
- 资源 (3)
- 收藏
- 关注
原创 对书稿的不定期更新……
书稿算是完成了第一版的定稿了,已经转成PDF供有需要的朋友免费使用,还请多多提出意见,以便进一步完善。以下是底稿更新的记录,适当的时候再放出第二版的定稿。
2020-03-29 07:18:26
2525
2
原创 我写的书:《C++,挑战编程——程序设计竞赛进阶训练指南》
这是我写的书《C++,挑战编程——程序设计竞赛进阶训练指南》的初稿,欢迎大家提出意见。本书的读者对象为计算机专业(或对ACM/ICPC竞赛感兴趣的其他专业)学生以及编程爱好者。可以作为ACM/ICPC竞赛训练的辅助参考书。本书不是面向初学者的C++语言教程,要求读者已经具备一定的C或C++编程基础,有一定的英语阅读能力,了解基本的数据结构,已经掌握了初步的程序设计思想和方法,具备相应的算法分析...
2019-05-17 10:23:10
18342
79
原创 《挑战编程:程序设计竞赛训练手册》- 题解(全)
PC = Programming Challenges (http://www.programming-challenges.com/)UVa = University of Valladolid Online Judge(http://uva.onlinejudge.org/)《挑战编程:程序设计竞赛训练手册》PDF下载地址(英文版):http://acm.cs.buap.mx
2011-11-16 22:06:17
15611
10
原创 《挑战编程:程序设计竞赛训练手册》- 题解(第一章 - 第八章)
PC = Programming Challenges (http://www.programming-challenges.com/)UVa = University of Valladolid Online Judge(http://uva.onlinejudge.org/)《挑战编程:程序设计竞赛训练手册》PDF下载地址(英文版):http://acm.cs.buap.mx/do
2011-08-28 17:24:12
24597
5
原创 UVa 12487 Midnight Cowboy
本文研究了树上随机游走问题,提出了一种基于高斯消元法的概率求解方法。针对Nlogonia城市道路系统构成的树形结构,我们建立了线性方程组模型,其中每个节点的概率由其相邻节点决定,边界条件为酒店节点的固定概率(廉价酒店为1,昂贵酒店为0)。通过构建增广矩阵并应用高斯消元算法,可以高效求解从任意起点出发先到达廉价酒店的概率。实验表明,该方法在节点数N≤100时具有较好的时间复杂度(O(N³))和数值稳定性。文章详细阐述了算法实现步骤,包括邻接表构建、矩阵初始化、高斯消元和回代求解等关键环节,为类似随机游走问题提
2025-12-04 12:09:09
263
原创 UVa 12483 Toboggan of Marbles
本文解决弹珠滑梯玩具中弹珠最大直径的计算问题。通过分析弹珠可能被卡住的两种情况:挡板自由端到对侧木杆的水平距离,以及相邻挡板自由端到下一挡板线段的最短距离。算法首先计算每个挡板的水平间隙,然后计算相邻挡板间的过渡距离,取最小值作为弹珠最大直径。采用几何方法精确计算点到线段的距离,确保结果正确。时间复杂度为O(N),适用于大规模输入。最终输出保留两位小数的最大直径值。
2025-12-04 11:54:09
198
原创 UVa 11184 Joyful Ride
本文探讨了环形过山车轨道塔高度的构造问题,要求塔高为1到n+1的互不相同整数,且相邻塔高差的绝对值恰好覆盖1到n。通过数学分析,发现解存在的条件是n≡0或3(mod4)。对于满足条件的n,采用差分法构造序列:跳过特定差值后交替加减差值生成高度。该方法保证高度在合理范围内且满足所有约束,时间复杂度O(n)。提供的参考代码实现了这一构造过程,展示了数学分析与算法设计相结合解决复杂问题的思路。
2025-12-04 10:02:17
286
原创 UVa 10548 Find the Right Changes
本文研究了以两种货物交换支付金额的问题,转化为求解线性丢番图方程的非负整数解。当两种货物单位价值均为正时,通过扩展欧几里得算法计算解的个数;当其中一种为负时,只需判断解的存在性,存在则有无穷多解。算法对每组数据在O(log M)时间内完成,适用于大规模输入。样例测试验证了算法的正确性,能正确处理无解、有限解和无穷解的情况。
2025-12-04 08:21:35
288
原创 UVa 11499 Longest Increasing Sub-sequence
本文研究了一个关于寻找严格递增子矩阵的问题。给定一个N×M的整数矩阵,要求找出一个子矩阵,使其按行优先顺序线性化后形成严格递增序列,并返回最大子矩阵的元素个数。通过分析矩阵的矩形性质和递增条件,提出了一种高效算法:枚举左右边界并结合行滑动窗口技术,动态维护行内递增和行间衔接递增的信息。算法时间复杂度为O(NM²),适用于N,M≤600的规模。代码实现通过预处理和滑动窗口优化,有效减少了计算复杂度,能够在合理时间内解决问题。
2025-12-03 20:30:06
587
原创 UVa 12357 Ball Stacking
该问题描述了一个金字塔形堆叠的球游戏,参赛者需选择球以获得最大奖品值,但选择时必须遵循依赖关系:拿走一个球必须同时拿走其上方所有支撑球。问题转化为在有向无环图中寻找最大权闭合子图。通过动态规划解决,关键步骤包括: 计算列前缀和g[i][j]表示第j列前i行球值之和; 计算金字塔区域总和w[i][j]作为右下角(i,j)的完整区域值; 定义dp[i][j]为以(i,j)为右下角的最大奖品值,状态转移考虑独立金字塔或与左侧区域结合两种情况; 使用后缀最大值数组sdp优化查找过程,将复杂度从O(N³)
2025-12-03 19:54:42
564
原创 UVa 10953 Stochastic Digit Generator
本文研究了一个随机数字生成器问题,要求计算在特定约束条件下生成的数字除以11后余数为指定值的概率。输入包含多组数据,每组给出数字0-9的生成概率、查询格式字符串和目标余数。解题关键在于利用模11的性质(10^i ≡ (-1)^i mod 11)和动态规划方法,通过状态转移计算概率。算法从右到左处理数字位,维护余数状态的概率分布,最终输出保留8位小数的结果。时间复杂度为O(查询数×位数×11×10),适用于题目给定的数据规模。
2025-12-03 19:10:08
551
原创 UVa 419 Matching Meetings
本文介绍了一个会议安排问题的解决方案,需要为多位教授寻找共同空闲时间段。问题涉及从当前日期开始一年内的工作日安排,将每天9:00-17:00划分为32个15分钟时段。算法采用日期离散化处理和位图标记忙碌时段的方法,通过遍历所有工作日寻找连续空闲时段。解决方案包括日期处理系统、时间离散化、忙碌时段标记和会议查找四个主要步骤,使用map和bitset等数据结构高效处理时间冲突。时间复杂度约为350,000次操作,空间复杂度为O(D+n),能够满足题目要求的约束条件。
2025-12-03 18:35:18
320
原创 UVa 10623 Thinking Backward
本文研究平面分割问题的反向求解:给定最大区域数N,求由椭圆(m)、圆(n)和三角形(p)组成的有效组合。通过推导混合图形的区域数公式F(m,n,p)=2m^2-2m+n^2-n+3p^2-3p+6mp+4mn+6np+2,将问题转化为求解关于n的二次方程。算法通过枚举m和p(范围0-99),计算判别式并验证整数解,确保在O(10^4)时间内高效求解。输出按$m$和$n$升序排列,若无解则输出Impossible.。关键点包括公式验证、算法优化和边界处理。
2025-12-03 15:43:47
441
原创 UVa 11768 Lattice Point or Not
本文研究线段上格点数量的计算问题,针对输入坐标可能含一位小数的特殊情况,提出了一种高效算法。通过将坐标乘以10转换为整数处理,利用最大公约数确定线段上的候选点,并筛选满足坐标能被10整除的格点。该方法避免了浮点精度问题,将问题转化为整数域计算。测试样例验证了算法的正确性,包括端点重合、无格点和多格点等情况。关键点在于坐标转换、参数化表示和条件筛选,保证了算法在较大输入范围内的效率。
2025-12-03 12:04:36
454
原创 UVa 105 The Skyline Problem
本文提出了一种解决天际线问题的扫描线算法。给定一系列按左边界排序的建筑物三元组(Li,Hi,Ri),算法通过初始化高度数组,更新每个x坐标处的最大建筑高度,然后扫描整个区间生成轮廓转折点。时间复杂度为O(n*MAXN),空间复杂度O(MAXN),适用于坐标范围较小的情况。算法直观高效,最后输出由x坐标和高度交替组成的向量序列,以0高度结束。
2025-12-03 11:55:32
242
原创 UVa 104 Arbitrage
本文探讨了套汇问题的动态规划解法。通过将货币兑换建模为有向图,利用动态规划寻找最短利润环。定义状态dp[i][j][k]表示从货币i出发,经k步到j的最大利润,通过三重循环递推更新状态,并在发现利润超过1%时立即终止。算法复杂度为O(n^4),适用于n≤20的情况,能有效判断是否存在套汇机会并输出最短路径。代码实现采用类似Floyd-Warshall的方法,兼顾了效率和正确性。
2025-12-03 11:29:18
449
原创 UVa 1575 Factors
算术基本定理表明,每个大于1的整数可以唯一表示为质数的乘积。定义函数f(k)为整数k的质因子排列数,例如f(10)=2。题目要求对于给定的n,找到最小的k使得f(k)=n。通过分析f(k)的计算公式(多重排列数),将问题转化为寻找满足特定组合数条件的质数指数序列。采用深度优先搜索枚举可能的指数组合,并利用剪枝优化避免溢出。最终通过预处理和映射存储结果,实现高效查询。 关键词:质因数分解、排列数、组合数学、深度优先搜索、剪枝优化
2025-12-03 07:34:02
751
原创 UVa 10949 Kids in a Grid
题目描述了两个孩子在H×W网格中行走,分别生成字符串SA和SB。要求通过删除最少字符使两字符串相同,等价于求最长公共子序列(LCS)。输入包含网格、起点和移动序列,输出需删除的字符数。关键步骤包括:1) 读取网格并生成路径字符串;2) 使用动态规划(滚动数组优化)或Hunt-Szymanski算法计算LCS;3) 处理空移动序列和坐标转换等边界情况。样例分析展示了从路径字符串"ABCDG"和"ADEB"中删除3和2个字符得到LCS"AB"或&
2025-12-02 21:15:46
495
原创 UVa 10486 Mountain Village
本文研究了在二维网格中寻找满足特定条件的连通区域问题。给定一个r×c的海拔矩阵,需要为每个查询k_i找到包含至少k_i个格子的连通区域,使区域内最高与最低海拔的差值最小。通过枚举高度区间并结合BFS验证的方法,利用高度值范围有限的特点,实现了高效求解。算法时间复杂度约为O(100×7×1600),适用于题目给定的约束条件。关键步骤包括预处理高度值、二分查找最优区间以及基于BFS的连通性检查。
2025-12-02 20:49:01
524
原创 UVa 10317 Equating Equations
本文探讨了一个伪等式重新排列问题,要求在不改变运算符顺序的情况下,通过调整数字顺序使等式成立。关键步骤包括:解析输入等式,将数字移到等式左侧并确定符号;计算总和,检查是否能被均分;使用回溯法搜索满足条件的数字子集;最后重新分配数字并输出结果。算法通过剪枝优化,处理最多16个数字的等式,时间复杂度为组合数级别。代码实现展示了完整的解析和求解过程,适用于类似数学排列问题的解决。
2025-12-02 20:37:26
672
原创 UVa 766 Sum of Powers
本文研究自然数幂和的计算问题,提出了一种基于伯努利数的高效算法。给定k值,我们证明了S_k(n)可以表示为n的k+1次多项式,其系数为有理数。通过预处理组合数和伯努利数,使用分数运算避免精度问题,算法能在O(k^2)时间内计算出最小分母M和整数系数a_j。特别处理了k=0的边界情况,并确保最高次系数为正。该方法比直接求和更高效,适用于大规模计算。
2025-12-02 19:48:02
643
原创 UVa 11493 The Club Ballroom
题目要求用宽度固定、长度不同的木板铺设舞厅地板,需满足方向一致、无重叠、最多两块拼接且不切割的限制。将问题分解为横向和纵向两种铺设方向,统一转换为厘米避免浮点误差。使用贪心策略优先分配单块完整木板,其次寻找拼接对。算法通过统计木板长度频率,检查每种方向是否可行并计算最少木板数。若两种方向均不可行则输出"impossivel"。时间复杂度为O(K log K),适用于大规模输入。
2025-12-02 18:56:33
455
原创 UVa 10665 Diatribe against Pigeonholes
本题要求为N个工人分配信箱,需满足包裹数越大的工人离书架中心越远的约束,并输出字母序最小的分配方案。核心在于设计贪心算法结合动态排序策略:使用双指针从两侧向中心分配,每次处理两个工人。采用两种排序方式——cmp1按包裹数降序、字母序升序选择左边工人,cmp2按包裹数降序、字母序降序选择右边工人。每次分配后重新排序剩余工人,确保在满足距离约束的前提下,左边放置字母序较小的工人,右边放置字母序较大的工人。通过动态调整,算法在O(N²logN)时间内求得全局字母序最小的解,由于N<26,效率完全可行。最终输出工人
2025-12-02 17:03:46
925
原创 UVa 1078 Steam Roller
题目要求计算蒸汽压路机在特殊规则下的最短路径。压路机通过街道的时间会根据其运动状态变化:若改变方向或停止/启动,时间加倍。采用Dijkstra算法,状态定义为(路口ID,方向,时间),通过优先队列处理三种转移情况(停止、启动、连续运动)。算法复杂度为O(R×C×log(R×C)),需注意输入格式和街道时间的双向存储。最终输出到达终点停止状态的最短时间或 Impossible。
2025-12-02 11:42:11
1203
原创 UVa 13035 Another Combination Problem
本文探讨了一个组合计数问题:给定N个盒子,第i个盒子有i+1个不同颜色的球。从任选一个盒子中取出两个球分别放在左右手中(考虑顺序),求所有可能的方案数。通过分析发现,总方案数为S(N)=N(N+1)(N+2)/3。针对大数取模问题,提出使用乘法逆元来处理除法运算。最终给出了时间复杂度为O(TlogM)的算法实现,其中T是测试用例数,M=10^9+7。文章强调了模运算中防止整数溢出的重要性,并验证了公式的正确性。
2025-12-01 20:43:24
534
原创 UVa 12586 Overlapping Characters
本文探讨了一个字符叠加检测问题。给定36个字符的16×43像素网格表示和若干查询,每个查询包含M(≤18)个字符,需判断其中哪些字符能通过检查单个像素是否涂黑来确认其存在。解题关键在于找到每个字符独有的涂黑像素点,即该像素点不被其他查询字符覆盖。采用预处理字符网格和模拟叠加层的方法,通过遍历每个字符的像素点并检查叠加层状态,高效地判断字符可检测性。算法时间复杂度约为O(Q·M·16·43),在给定约束下完全可行。
2025-12-01 20:27:03
992
原创 UVa 103 Stacking Boxes
本文研究了n维盒子的最长嵌套序列问题。通过将每个盒子的维度排序后建立嵌套关系,转化为有向无环图的最长路径问题。采用动态规划方法求解,时间复杂度为O(k²·n),其中k为盒子数量,n为维度数。算法首先对盒子进行预处理排序,然后通过DP计算最长序列长度并记录路径,最后输出从最内层开始的盒子编号。示例分析表明该方法能正确求解5个2维盒子的最长嵌套序列。该算法高效可靠,适用于题目给定的约束条件(n≤10,k≤30)。
2025-12-01 18:56:23
824
原创 UVa 13291 Frosting on the Cake
本文研究了蛋糕糖霜面积计算问题,将矩形区域按垂直和水平条纹划分为n×n块,每块颜色由(i+j) mod 3决定。通过观察发现颜色分布仅与下标模3的余数相关,提出将条纹宽度和高度按余数分组求和的优化方法。该算法将时间复杂度从O(n²)降至O(n),使用公式计算三种颜色的总面积。代码实现验证了方法的正确性,示例分析展示了具体计算过程。该优化适用于大规模数据,解决了直接枚举法计算量过大的问题。
2025-12-01 17:17:51
836
原创 UVa 1291 Dance Dance Revolution
本文研究了跳舞机游戏DDR的最优移动策略问题。通过动态规划方法,定义状态为双脚位置,并建立体力消耗表来计算不同移动方式的代价。算法使用滚动数组优化空间,时间复杂度为O(N),空间复杂度为O(25)。关键点在于正确处理游戏规则和精确计算移动消耗。实验结果表明,该方法能高效求解最小体力消耗问题。
2025-12-01 16:54:56
757
原创 UVa 10886 Standard Deviation
本文介绍了如何计算伪随机数生成器生成数列的标准差。给定种子seed和生成数量n,通过分析生成器代码,推导出标准差的计算公式σ=√(∑x_i²/n - (∑x_i/n)²)。算法设计采用在线累加sumX和sumX2的方式,避免了存储所有数据,时间复杂度O(n),空间复杂度O(1)。实现时需注意浮点精度问题,使用long double存储,并对负方差作零处理。最终输出保留5位小数,满足题目精度要求。
2025-12-01 16:45:57
708
原创 UVa 1289 Stacking Plates
题目要求将多个有序盘子堆合并为一个有序堆,允许拆分和合并操作。关键在于最小化拆分次数。通过动态规划,将盘子按直径分组,记录每种直径出现在哪些堆中。状态转移时,若当前堆与前一个处理的堆相同且满足条件,可减少拆分次数。最终,最小操作次数为 (2 * minSplit + n - 1)。算法时间复杂度为 (O(M * n^2)),适用于题目约束。代码实现通过预处理和动态规划高效求解。
2025-12-01 16:26:20
958
原创 UVa 10542 Hyper-drive
本文探讨了n维空间中两点间直线穿过的单位超立方体数量的计算方法。通过分析一维和二维情况,发现该问题可转化为数论问题,并利用容斥原理和最大公约数进行求解。对于n维空间,当任意维度差为零时结果为零;否则,通过遍历所有非空子集,根据子集大小的奇偶性加减各维度差的最大公约数来计算最终结果。算法时间复杂度为O(n·2^n),在n≤10时高效可行。代码实现验证了该方法的正确性,示例计算过程直观展示了容斥原理的应用。
2025-12-01 16:11:21
865
原创 UVa 11106 Rectilinear Polygon
本文研究如何判断给定平面上的n个整数坐标点能否构成一个简单直角多边形。通过分析直角多边形的特性,提出两种算法方案:1)扫描线算法,通过奇偶性检查和线段相交检测确保多边形简单性;2)优化方案利用并查集检测连通性,在满足奇偶性条件下单连通分量即等价于简单多边形。两种方案均具有O(n log n)时间复杂度,适合大规模数据。优化方案通过理论保证简化了实现,仅需验证单连通分量即可确定多边形简单性,避免了复杂的几何检测。
2025-11-30 20:02:16
738
原创 UVa 491 Tile Topology
本文探讨了计算卫生间瓷砖独特排列数量的数学问题。通过分析,发现该问题本质上是计算单边多联骨牌的数量。对于编程实现,推荐采用预计算打表法,直接查找OEIS A000988序列中的对应值。该方法避免了复杂的组合计算,保证了算法效率。以n=3为例验证了数学正确性,并提供了简洁的C++实现代码。这种打表方法在竞赛环境中既实用又高效,是解决此类问题的优选方案。
2025-11-30 15:52:40
673
原创 UVa 13271 Brick Wall
题目要求计算蚂蚁在特殊砖墙结构中从起点到终点的最短路径。砖墙由2×1的矩形砖块规则排列,蚂蚁只能在砖块缝隙间移动。算法通过分情况处理:同一行直接水平移动;行差≤列差时采用曼哈顿距离;行差>列差时采用蛇形移动策略,包括水平对齐、奇偶性调整和垂直移动三步骤。该解法在O(1)时间内完成计算,巧妙利用了砖墙结构的连通性特征。
2025-11-30 15:35:19
638
原创 UVa 11920 0s 1s and ? Marks
题目要求将包含0、1和?的字符串中的?替换为0或1,使得最大连续相同字符组的长度最小化。通过分段处理字符串,分析固定字符段和问号段的不同情况,采用贪心策略填充问号。关键点在于处理问号段时根据前后字符关系和问号数量的奇偶性确定最优填充方式,从而在O(n)时间内解决问题。算法通过分段简化问题,适用于各类字符串处理场景。
2025-11-30 13:56:15
426
原创 UVa 838 Worm World
该问题要求在N×N网格上寻找蠕虫的最长移动路径,路径中数字不能重复出现。采用深度优先搜索(DFS)算法,通过理论最大值剪枝、反向数字访问标记和搜索顺序优化来提升效率。预处理计算不同数字数量作为理论上界,DFS过程中使用布尔数组记录数字访问状态,并采用逆时针搜索顺序。算法复杂度为O(N²×4^L),实际运行效率优于理论值。参考代码展示了从每个格子出发的DFS实现,最终输出最长路径长度。该解法适用于N≤12的网格,通过巧妙优化解决了指数级搜索问题。
2025-11-30 13:36:22
629
原创 UVa 716 Commedia dell‘Arte
本文分析了三维拼图问题的可解性判定方法。通过扩展二维拼图的奇偶性理论,推导出三维情况下的判定规则:当立方体边长为奇数时,要求初始排列逆序数为偶数;边长为偶数时,逆序数奇偶性需与空位到目标位置的Y轴和Z轴移动步数之和的奇偶性一致。算法采用归并排序高效计算逆序数,时间复杂度为O(M³logM),能够处理M≤100的大规模数据。实验证明该方法正确可靠,为三维拼图问题提供了有效的解决方案。
2025-11-30 13:31:27
748
原创 UVa 12436 Rip Van Winkle‘s Code
题目要求高效处理对数组的三种区间更新操作(A、B、C)和一种查询操作(S)。直接模拟会导致超时,因此需要采用线段树数据结构,利用数学公式计算等差数列区间和,并通过懒标记技术实现高效的区间更新和查询。时间复杂度从O(T×N)优化到O(TlogN),适用于大规模数据。
2025-11-30 12:47:43
730
原创 UVa 10822 Planet of the Rock Paper and Scissors
题目要求根据个体间的支配关系(石头剪刀布规则)判断能否唯一确定所有个体的种族。每个社区被视为一个连通图,通过构建有向图和无向底图分析连通性。算法分为三步:1) 检测连通分量;2) 通过BFS传播种族分配;3) 根据冲突或连通性输出结果。若存在冲突优先报告,否则根据连通分量数量判断是否唯一确定或数据不足。时间复杂度为O(n+m)。
2025-11-30 11:15:19
921
USB 存储设备使用痕迹检测和删除工具(C#)
2014-01-19
.Net 安装程序制作
2015-02-13
自动更新程序示例代码-Visual Basic语言编写
2014-01-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅