- 博客(679)
- 资源 (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
18345
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
15613
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 11539 Another Word Game
本文探讨了一个字符串分段决策问题,旨在通过动态规划和字典树优化求解最大得分。给定一个单词字典和字符串S,需要将S分割为连续不重叠子串,匹配字典单词加分,否则按长度扣分。算法采用Trie树存储字典以加速查询,动态规划状态dp[i]表示处理前i个字符的最大得分。状态转移时枚举所有可能子串,分别处理匹配加分和强制扣分情况,时间复杂度为O(|S|×100)。最终输出dp[|S|]作为答案。代码实现展示了Trie构建、动态规划转移和结果计算过程,适用于大规模数据。
2025-12-05 19:40:21
632
原创 UVa 13017 Canvas Painting
题目要求将一组画布通过分裂操作涂成不同颜色,使消耗的墨水量最小。通过逆向思考,将问题转化为哈夫曼编码模型:每次合并两个最小的画布组,合并成本为组大小之和。使用优先队列实现哈夫曼算法,时间复杂度为O(N log N)。最终所有非叶子节点的累加和即为最小墨水量。
2025-12-05 16:45:13
551
原创 UVa 1707 Surveillance
题目要求用最少数量的摄像头覆盖环形大楼的所有墙壁。将环形问题转化为链式结构后,通过预处理每个摄像头的最远覆盖范围,并利用贪心算法和倍增法优化求解。具体步骤包括:标准化区间、预处理覆盖范围、构建倍增表以快速计算最小覆盖步数。若无法覆盖所有墙壁则输出impossible。算法的时间复杂度为O((n+k) log n),适用于大规模数据。
2025-12-05 16:41:59
312
原创 UVa 1418 WonderTeam
本文研究了巴西联赛中WonderTeam的最差排名问题。通过构造性证明,当队伍数n≥5时,WonderTeam在满足胜场最多、进球最多、失球最少三个绝对条件的同时,可以跌至最后一名;n=4时为第二名;n≤3时只能排名第一。关键是通过设计特定的比赛结果,使WonderTeam积分尽可能低而其他队伍积分尽可能高。该结论已通过严格的数学分析和边界验证,并给出了O(1)时间复杂度的解决方案。
2025-12-05 16:07:48
327
原创 UVa 12093 Protecting Zonk
本文研究了在树形结构村庄中放置两种守卫机器人(士兵和中士)的最小成本问题。通过动态规划方法,定义了四种状态来精确描述节点与父节点间的覆盖关系。状态转移考虑了机器人覆盖范围的不同特性,确保所有道路被保护的同时最小化总成本。算法采用树形DFS遍历,时间复杂度为O(N),适用于大规模输入。样例测试验证了方法的正确性和高效性。
2025-12-05 15:18:45
681
原创 UVa 11979 Hamming Base
题目要求将N个M位的N进制数通过最少步数修改,使得任意两个数在所有位置上数字都不相同。每次操作只能将一个数字加1或减1(不能越界)。关键结论是:对于每个位置,将当前数字排序后与0到N-1顺序配对,总修改步数最小。算法复杂度为O(M*N log N),适用于给定数据范围。最终结果为所有位置修改步数之和。
2025-12-05 13:07:48
539
原创 UVa 10732 The Strange Research
题目要求从给定的N个浮点数中,统计满足表达式(a+b)(1-ab)>0的无序对(a,b)的数量。通过数学分析,将条件转化为两种情况:(1) a+b>0且ab<1;(2) a+b<0且ab>1。针对每种情况,固定a后确定b的范围,利用排序和二分查找高效统计符合条件的b的数量。算法首先对数组排序,然后枚举每个a,通过二分查找快速计算满足条件的b的数量,最终将总数除以2得到答案。该方法时间复杂度为O(N log N),适用于大规模数据。样例输入输出验证了算法的正确性。
2025-12-05 11:28:34
592
原创 UVa 10468 Rigid Circle Packing
本文探讨了阿兹特克国王订购玻璃圆装饰品的运输问题。题目要求将半径相同的圆装入正方形盒子,确保圆不能移动(刚性堆积),并要求盒子尽可能大。输入为圆的半径r,输出装9个圆和10个圆时的盒子边长。通过几何分析发现,最优解可通过固定比例常数计算得出:装9个圆时边长≈7.02251r,装10个圆时≈7.51913r。解题关键在于利用已知最优比例直接计算,而无需复杂推导。参考代码展示了如何实现这一计算。
2025-12-05 08:13:33
484
原创 UVa 10619 Advanced Causal Measurements
本文研究一维宇宙中n个观测事件与m个未知原因事件的因果关系。通过将因果条件转化为区间覆盖问题,提出了一种结合二分查找和贪心算法的高效解决方案。算法首先确定原因事件可能的最晚最早时间T的范围,然后通过二分法寻找最大的可行T,使得所有观测事件都能被m个原因事件覆盖。每次二分检查时,将观测事件转化为位置区间,并采用贪心策略验证m个点能否覆盖所有区间。该算法时间复杂度为O(n log n log R),能有效处理大规模输入。代码实现中注意使用long long类型防止溢出,并合理设置二分上下界。
2025-12-05 08:13:16
799
原创 UVa 708 Dreisam Equations
在Dreisamwaiste星球发现的古老等式中,运算符已褪色,仅保留数字、括号和等号。需判断能否通过插入+、-、*运算符使等式成立。计算规则严格从左到右,括号优先。输入包含多个等式,每个等式左侧为数字,右侧可能含括号和多个数字。输出插入运算符后的等式或"Impossible"。解题需处理无优先级运算、括号嵌套和运算符位置搜索,采用深度优先搜索策略,时间复杂度约为O(3^11)。
2025-12-05 08:12:53
689
原创 UVa 12382 Grid of Lamps
本文研究了给定行列亮度排列下网格灯最少亮灯数问题。通过分析问题本质,发现关键在于将行和列亮度降序排列后,利用Gale-Ryser定理判断可图性,并推导出最小亮灯数的计算公式。算法步骤包括:计算行列亮度总和、排序处理、遍历计算可能的最小值。时间复杂度为O(M×N),能有效处理大规模数据。验证表明该方法正确解决了样例问题,并考虑了各种边界情况。最终代码实现了该算法,确保在合理时间内得出最优解。
2025-12-04 15:37:00
512
原创 UVa 11243 Texas Trip
本题要求覆盖平面上给定整数坐标点的最小正方形面积。关键难点在于正方形可以旋转任意角度。解法核心是通过旋转坐标系将问题转化为函数极值问题:对于每个旋转角度θ,计算将所有点旋转-θ后,覆盖它们所需轴对齐正方形的最小边长s(θ)。由于正方形具有90度旋转对称性,只需在[0, π/2]区间内对s(θ)进行三分搜索找到最小值。每次函数值计算为O(n),三分搜索迭代60次可保证精度。算法时间复杂度为O(60n),对于n≤30高效可行,且满足答案误差不超过0.1的要求。
2025-12-04 14:50:52
739
原创 UVa 12487 Midnight Cowboy
本文研究了树上随机游走问题,提出了一种基于高斯消元法的概率求解方法。针对Nlogonia城市道路系统构成的树形结构,我们建立了线性方程组模型,其中每个节点的概率由其相邻节点决定,边界条件为酒店节点的固定概率(廉价酒店为1,昂贵酒店为0)。通过构建增广矩阵并应用高斯消元算法,可以高效求解从任意起点出发先到达廉价酒店的概率。实验表明,该方法在节点数N≤100时具有较好的时间复杂度(O(N³))和数值稳定性。文章详细阐述了算法实现步骤,包括邻接表构建、矩阵初始化、高斯消元和回代求解等关键环节,为类似随机游走问题提
2025-12-04 12:09:09
572
原创 UVa 12483 Toboggan of Marbles
本文解决弹珠滑梯玩具中弹珠最大直径的计算问题。通过分析弹珠可能被卡住的两种情况:挡板自由端到对侧木杆的水平距离,以及相邻挡板自由端到下一挡板线段的最短距离。算法首先计算每个挡板的水平间隙,然后计算相邻挡板间的过渡距离,取最小值作为弹珠最大直径。采用几何方法精确计算点到线段的距离,确保结果正确。时间复杂度为O(N),适用于大规模输入。最终输出保留两位小数的最大直径值。
2025-12-04 11:54:09
473
原创 UVa 11184 Joyful Ride
本文探讨了环形过山车轨道塔高度的构造问题,要求塔高为1到n+1的互不相同整数,且相邻塔高差的绝对值恰好覆盖1到n。通过数学分析,发现解存在的条件是n≡0或3(mod4)。对于满足条件的n,采用差分法构造序列:跳过特定差值后交替加减差值生成高度。该方法保证高度在合理范围内且满足所有约束,时间复杂度O(n)。提供的参考代码实现了这一构造过程,展示了数学分析与算法设计相结合解决复杂问题的思路。
2025-12-04 10:02:17
527
原创 UVa 10548 Find the Right Changes
本文研究了以两种货物交换支付金额的问题,转化为求解线性丢番图方程的非负整数解。当两种货物单位价值均为正时,通过扩展欧几里得算法计算解的个数;当其中一种为负时,只需判断解的存在性,存在则有无穷多解。算法对每组数据在O(log M)时间内完成,适用于大规模输入。样例测试验证了算法的正确性,能正确处理无解、有限解和无穷解的情况。
2025-12-04 08:21:35
678
原创 UVa 11499 Longest Increasing Sub-sequence
本文研究了一个关于寻找严格递增子矩阵的问题。给定一个N×M的整数矩阵,要求找出一个子矩阵,使其按行优先顺序线性化后形成严格递增序列,并返回最大子矩阵的元素个数。通过分析矩阵的矩形性质和递增条件,提出了一种高效算法:枚举左右边界并结合行滑动窗口技术,动态维护行内递增和行间衔接递增的信息。算法时间复杂度为O(NM²),适用于N,M≤600的规模。代码实现通过预处理和滑动窗口优化,有效减少了计算复杂度,能够在合理时间内解决问题。
2025-12-03 20:30:06
809
原创 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
636
原创 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
719
原创 UVa 419 Matching Meetings
本文介绍了一个会议安排问题的解决方案,需要为多位教授寻找共同空闲时间段。问题涉及从当前日期开始一年内的工作日安排,将每天9:00-17:00划分为32个15分钟时段。算法采用日期离散化处理和位图标记忙碌时段的方法,通过遍历所有工作日寻找连续空闲时段。解决方案包括日期处理系统、时间离散化、忙碌时段标记和会议查找四个主要步骤,使用map和bitset等数据结构高效处理时间冲突。时间复杂度约为350,000次操作,空间复杂度为O(D+n),能够满足题目要求的约束条件。
2025-12-03 18:35:18
512
原创 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
689
原创 UVa 11768 Lattice Point or Not
本文研究线段上格点数量的计算问题,针对输入坐标可能含一位小数的特殊情况,提出了一种高效算法。通过将坐标乘以10转换为整数处理,利用最大公约数确定线段上的候选点,并筛选满足坐标能被10整除的格点。该方法避免了浮点精度问题,将问题转化为整数域计算。测试样例验证了算法的正确性,包括端点重合、无格点和多格点等情况。关键点在于坐标转换、参数化表示和条件筛选,保证了算法在较大输入范围内的效率。
2025-12-03 12:04:36
656
原创 UVa 105 The Skyline Problem
本文提出了一种解决天际线问题的扫描线算法。给定一系列按左边界排序的建筑物三元组(Li,Hi,Ri),算法通过初始化高度数组,更新每个x坐标处的最大建筑高度,然后扫描整个区间生成轮廓转折点。时间复杂度为O(n*MAXN),空间复杂度O(MAXN),适用于坐标范围较小的情况。算法直观高效,最后输出由x坐标和高度交替组成的向量序列,以0高度结束。
2025-12-03 11:55:32
354
原创 UVa 104 Arbitrage
本文探讨了套汇问题的动态规划解法。通过将货币兑换建模为有向图,利用动态规划寻找最短利润环。定义状态dp[i][j][k]表示从货币i出发,经k步到j的最大利润,通过三重循环递推更新状态,并在发现利润超过1%时立即终止。算法复杂度为O(n^4),适用于n≤20的情况,能有效判断是否存在套汇机会并输出最短路径。代码实现采用类似Floyd-Warshall的方法,兼顾了效率和正确性。
2025-12-03 11:29:18
981
原创 UVa 1575 Factors
算术基本定理表明,每个大于1的整数可以唯一表示为质数的乘积。定义函数f(k)为整数k的质因子排列数,例如f(10)=2。题目要求对于给定的n,找到最小的k使得f(k)=n。通过分析f(k)的计算公式(多重排列数),将问题转化为寻找满足特定组合数条件的质数指数序列。采用深度优先搜索枚举可能的指数组合,并利用剪枝优化避免溢出。最终通过预处理和映射存储结果,实现高效查询。 关键词:质因数分解、排列数、组合数学、深度优先搜索、剪枝优化
2025-12-03 07:34:02
1026
原创 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
723
原创 UVa 10486 Mountain Village
本文研究了在二维网格中寻找满足特定条件的连通区域问题。给定一个r×c的海拔矩阵,需要为每个查询k_i找到包含至少k_i个格子的连通区域,使区域内最高与最低海拔的差值最小。通过枚举高度区间并结合BFS验证的方法,利用高度值范围有限的特点,实现了高效求解。算法时间复杂度约为O(100×7×1600),适用于题目给定的约束条件。关键步骤包括预处理高度值、二分查找最优区间以及基于BFS的连通性检查。
2025-12-02 20:49:01
745
原创 UVa 10317 Equating Equations
本文探讨了一个伪等式重新排列问题,要求在不改变运算符顺序的情况下,通过调整数字顺序使等式成立。关键步骤包括:解析输入等式,将数字移到等式左侧并确定符号;计算总和,检查是否能被均分;使用回溯法搜索满足条件的数字子集;最后重新分配数字并输出结果。算法通过剪枝优化,处理最多16个数字的等式,时间复杂度为组合数级别。代码实现展示了完整的解析和求解过程,适用于类似数学排列问题的解决。
2025-12-02 20:37:26
822
原创 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
753
原创 UVa 11493 The Club Ballroom
题目要求用宽度固定、长度不同的木板铺设舞厅地板,需满足方向一致、无重叠、最多两块拼接且不切割的限制。将问题分解为横向和纵向两种铺设方向,统一转换为厘米避免浮点误差。使用贪心策略优先分配单块完整木板,其次寻找拼接对。算法通过统计木板长度频率,检查每种方向是否可行并计算最少木板数。若两种方向均不可行则输出"impossivel"。时间复杂度为O(K log K),适用于大规模输入。
2025-12-02 18:56:33
623
原创 UVa 10665 Diatribe against Pigeonholes
本题要求为N个工人分配信箱,需满足包裹数越大的工人离书架中心越远的约束,并输出字母序最小的分配方案。核心在于设计贪心算法结合动态排序策略:使用双指针从两侧向中心分配,每次处理两个工人。采用两种排序方式——cmp1按包裹数降序、字母序升序选择左边工人,cmp2按包裹数降序、字母序降序选择右边工人。每次分配后重新排序剩余工人,确保在满足距离约束的前提下,左边放置字母序较小的工人,右边放置字母序较大的工人。通过动态调整,算法在O(N²logN)时间内求得全局字母序最小的解,由于N<26,效率完全可行。最终输出工人
2025-12-02 17:03:46
990
原创 UVa 1078 Steam Roller
题目要求计算蒸汽压路机在特殊规则下的最短路径。压路机通过街道的时间会根据其运动状态变化:若改变方向或停止/启动,时间加倍。采用Dijkstra算法,状态定义为(路口ID,方向,时间),通过优先队列处理三种转移情况(停止、启动、连续运动)。算法复杂度为O(R×C×log(R×C)),需注意输入格式和街道时间的双向存储。最终输出到达终点停止状态的最短时间或 Impossible。
2025-12-02 11:42:11
1389
原创 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
538
原创 UVa 12586 Overlapping Characters
本文探讨了一个字符叠加检测问题。给定36个字符的16×43像素网格表示和若干查询,每个查询包含M(≤18)个字符,需判断其中哪些字符能通过检查单个像素是否涂黑来确认其存在。解题关键在于找到每个字符独有的涂黑像素点,即该像素点不被其他查询字符覆盖。采用预处理字符网格和模拟叠加层的方法,通过遍历每个字符的像素点并检查叠加层状态,高效地判断字符可检测性。算法时间复杂度约为O(Q·M·16·43),在给定约束下完全可行。
2025-12-01 20:27:03
993
原创 UVa 103 Stacking Boxes
本文研究了n维盒子的最长嵌套序列问题。通过将每个盒子的维度排序后建立嵌套关系,转化为有向无环图的最长路径问题。采用动态规划方法求解,时间复杂度为O(k²·n),其中k为盒子数量,n为维度数。算法首先对盒子进行预处理排序,然后通过DP计算最长序列长度并记录路径,最后输出从最内层开始的盒子编号。示例分析表明该方法能正确求解5个2维盒子的最长嵌套序列。该算法高效可靠,适用于题目给定的约束条件(n≤10,k≤30)。
2025-12-01 18:56:23
959
原创 UVa 13291 Frosting on the Cake
本文研究了蛋糕糖霜面积计算问题,将矩形区域按垂直和水平条纹划分为n×n块,每块颜色由(i+j) mod 3决定。通过观察发现颜色分布仅与下标模3的余数相关,提出将条纹宽度和高度按余数分组求和的优化方法。该算法将时间复杂度从O(n²)降至O(n),使用公式计算三种颜色的总面积。代码实现验证了方法的正确性,示例分析展示了具体计算过程。该优化适用于大规模数据,解决了直接枚举法计算量过大的问题。
2025-12-01 17:17:51
840
USB 存储设备使用痕迹检测和删除工具(C#)
2014-01-19
.Net 安装程序制作
2015-02-13
自动更新程序示例代码-Visual Basic语言编写
2014-01-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅