- 博客(1018)
- 资源 (3)
- 收藏
- 关注
原创 对书稿的不定期更新……
书稿算是完成了第一版的定稿了,已经转成PDF供有需要的朋友免费使用,还请多多提出意见,以便进一步完善。以下是底稿更新的记录,适当的时候再放出第二版的定稿。
2020-03-29 07:18:26
2558
2
原创 我写的书:《C++,挑战编程——程序设计竞赛进阶训练指南》
这是我写的书《C++,挑战编程——程序设计竞赛进阶训练指南》的初稿,欢迎大家提出意见。本书的读者对象为计算机专业(或对ACM/ICPC竞赛感兴趣的其他专业)学生以及编程爱好者。可以作为ACM/ICPC竞赛训练的辅助参考书。本书不是面向初学者的C++语言教程,要求读者已经具备一定的C或C++编程基础,有一定的英语阅读能力,了解基本的数据结构,已经掌握了初步的程序设计思想和方法,具备相应的算法分析...
2019-05-17 10:23:10
18651
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
15679
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
24703
5
原创 UVa 11705 Grasshopper
题目要求为蚱蜢迷宫中的每个蹦床标记最优跳跃方向,使得以最短路径到达出口(西北角)。路径优先比较跳跃次数,其次选择第一步最北、最西的路径。采用反向BFS从出口出发,计算各点到出口的最短距离,并依据规则确定方向(N/S/E/W)或标记不可达(X)。时间复杂度为O(R×C×(R+C)),适用于R,C≤50的输入。需注意多测试用例处理和方向优先级。
2026-04-13 11:12:48
98
原创 UVa 11165 Galactic Travel
本文研究了银河系行星间跳跃的最短路径问题,通过逆向思维提出高效解法。针对n个行星间存在大量允许跳跃但部分区间被禁止的情况,采用集合维护未访问节点,在BFS过程中跳过禁止区间快速定位可达节点。算法利用set存储未访问节点,结合禁止区间批量删除技术,避免了显式建图,实现了O((n+k)logn)的时间复杂度。该方法适用于稠密图且禁止边较少的情况,为大规模图搜索问题提供了新思路。
2026-04-13 11:12:26
226
原创 UVa 420 Supercomputer Selection The Sequel
本文提出了一种基于三维几何的超级计算机选择方法。通过将计算机在n个准则下的年度评分转化为多边形,并沿时间轴构建三维立体图形,以体积大小作为评价标准。文章详细阐述了精确计算立体体积的方法:将相邻年份的多边形分解为扇形区域,每个区域再分解为三个四面体,利用行列式公式计算体积并累加。该方法克服了简单面积平均的误差问题,实现了对计算机性能的精确评估。输入输出格式和计算过程通过示例代码清晰呈现,最终输出体积最大的计算机编号及其精确体积值。
2026-04-12 09:45:54
254
原创 UVa 12683 Odd and Even Zeroes
本文研究了阶乘末尾零个数Z(k)的奇偶性问题,提出了基于五进制展开和数位动态规划的高效解法。通过数学推导发现Z(k)的奇偶性等价于k的五进制表示中奇数位数字之和的奇偶性。针对n可达10^18的大规模数据,设计了数位DP算法,状态包括处理位数、当前奇偶性和边界限制。算法复杂度为O(log5n),能快速计算满足条件的k值数量。该解法巧妙地将数论特性与动态规划结合,适用于大规模数据的高效处理。
2026-04-12 09:45:25
400
原创 UVa 12326 Yummy Triangular Pizza
本文探讨了由N个等边三角形组成的连通图形的不同形状计数问题。通过分析多联三角形(polyiamond)的数学特性,发现该问题对应OEIS数列A006534。针对N≤16的情况,提出了直接查表法的高效解决方案,并验证了其正确性。最终给出简洁的参考代码,时间复杂度为O(T),适用于竞赛环境。该方法展示了组合数学在算法竞赛中的应用价值。
2026-04-11 20:25:11
439
原创 UVa 1063 Marble Game
本文探讨了一个弹珠进洞的棋盘游戏问题,提出基于BFS的状态空间搜索解法。游戏规则包括弹珠同时滚动、遇到障碍停止、进洞后洞被填满等。通过设计状态结构(弹珠位置、进洞情况)、墙的邻接表存储、以及按方向顺序模拟移动过程,实现高效搜索。BFS算法用于寻找最少移动次数,状态判重避免重复访问。该解法适用于小规模棋盘(N≤4),复杂度分析表明在合理范围内。
2026-04-11 20:24:53
685
原创 UVa 12264 Risk
本文研究了棋盘游戏《Risk》中的一个军队调度优化问题。玩家需要在满足移动约束(每个区域至少保留一个军队且只能相邻移动)的条件下,最大化所有与敌方相邻的边界区域军队数量的最小值。采用二分答案结合网络流建模的方法:通过拆点将区域分为入点和出点,构建网络流模型,利用最大流算法检查目标值的可行性。实验表明该方法能有效求解该优化问题,时间复杂度主要取决于二分查找和最大流计算。
2026-04-10 10:59:02
485
原创 UVa 10936 Land Surveyor‘s Job
本文探讨了土地测量中导线网闭合计算的模拟问题。给定n个站点组成闭合导线网,每个站点提供前视距离和顺时针夹角数据。算法从已知站点坐标出发,通过坐标递推公式依次计算后续站点位置,最后反向验证闭合误差。关键步骤包括:角度转换(度分秒转弧度)、坐标递推(利用旋转公式)、闭合检查(比较预测与实际位置的距离)。当闭合误差小于导线总长度的0.1%时判定为可接受。代码实现采用向量运算和浮点精度处理,确保测量结果的准确性。
2026-04-10 10:58:17
439
原创 UVa 1481 Genome Evolution
本文研究两条染色体排列中的“正证据”统计问题。通过分析连续子序列互为排列的条件,提出了一种高效算法:首先建立基因值到位置的映射,然后枚举第一个排列的所有子数组,实时维护对应元素在第二个排列中的位置极值,验证位置区间长度与子数组长度是否相等。该算法利用排列的无重复性,将复杂度从O(n³)优化到O(n²),适用于n≤3000的规模。示例验证表明算法正确,代码实现简洁高效。核心创新在于将集合相等条件转化为位置区间长度的等价判断,为排列匹配问题提供了新的解决思路。
2026-04-09 10:31:25
310
原创 UVa 12092 Paint the Roads
本文研究了一个有向图中选择边集的问题,要求所选边能分解为不相交的环且每个顶点恰好出现在k个环中,同时最小化总成本。通过分析发现,该问题可转化为最小费用流问题:每个顶点需要流出和流入k个单位流量,每条边的选择对应1单位流量转移并产生费用。采用拆点法建立流网络,左点管理出度,右点管理入度,超级源汇点分别连接左右点。通过求解最小费用最大流,验证是否存在满足条件的解并计算最小成本。该方法确保了最优解的正确性,适用于给定约束条件。
2026-04-09 10:30:51
493
原创 UVa 1414 Hanoi Towers
本文分析了汉诺塔问题的一个变种,其移动规则由固定策略列表决定。研究发现,尽管策略有720种可能,但递推关系仅需考虑3种关键情况:当B和C柱的首选移动都不指向A时,递推式为3倍;当存在A→P→A循环时,递推式为3倍加2;其他情况则遵循经典汉诺塔的2倍加1公式。通过提取各柱的首选移动目标,算法能在O(n)时间内计算出最少移动次数。该解法揭示了复杂规则下隐藏的简单数学结构,避免了繁琐的模拟过程。
2026-04-07 08:18:22
322
原创 UVa 12198 Working at the Restaurant
本文探讨了如何用两个栈模拟队列来处理餐厅盘子传递问题。关键在于将堆1作为输入栈接收新盘子,堆2作为输出栈。当堆2为空时,将堆1所有盘子移至堆2以保证先进先出顺序。通过合并操作(如批量DROP和TAKE)来满足输出行数不超过6N、总操作次数不超过6M的限制。算法时间复杂度O(N),空间复杂度O(1),正确性由栈的特性保证。代码实现时需注意边界条件和输出格式。
2026-04-07 08:18:07
469
原创 UVa 12316 Sewing Buttons with Grandma
本文探讨了一个关于扣子分配的排列组合问题。给定k种颜色的扣子,每种颜色有n_i个,要求将m个扣子分配到m个不同的扣眼上,计算所有可能的分配方案数。关键在于处理同色扣子的不可区分性,使用动态规划结合高精度计算来求解。具体方法是通过状态转移方程累计多重集排列数,并利用组合数优化计算。由于结果可能极大,需要实现高精度整数运算。最终的时间复杂度为O(k·m²·L),空间复杂度为O(m·L),适用于m≤50的输入规模。
2026-04-02 16:05:27
537
原创 UVa 12793 Confederation
本文研究了三维空间中行星分布区域的统计问题。通过将每个行星相对于M个平面的位置关系编码为二进制字符串,将几何问题转化为字符串统计问题。算法首先计算每颗行星与各平面的位置关系,生成唯一编码,然后统计相同编码的出现次数,最终输出包含最多行星的区域行星数。关键点在于使用二进制编码表示空间区域,并通过哈希表高效统计。算法复杂度为O(NM logN),能够处理题目给定的数据规模。该方法避免了复杂的几何计算,通过编码转换简化了问题求解。
2026-04-02 16:05:11
508
原创 UVa 12890 Easy Peasy
本文提出了一种高效的滑动窗口算法,用于统计数组中所有不包含重复整数的连续子数组数量。通过维护一个动态窗口和哈希表记录元素最后出现位置,算法能在O(N)时间内解决问题。该方法避免了暴力枚举的O(N^2)复杂度,适用于大规模数据(N≤100000)。关键点在于以右端点计数,通过调整左边界确保窗口内无重复元素,并累加有效子数组数量。代码实现简洁,空间复杂度为O(N)。
2026-03-31 09:38:09
391
原创 UVa 13022 Sheldon Numbers
本文提出了一种高效算法,用于统计区间内满足特定二进制模式的Sheldon数。通过预生成所有可能的Sheldon数(最多64位二进制),利用位运算构造数值并去重排序。对于查询区间[X,Y],使用二分查找快速统计数量。该方法利用数值范围限制(Y≤2^63),将问题转化为有限枚举,实现了高效的预处理和查询处理。实验表明生成的Sheldon数约3000个,使得每次查询可在对数时间内完成。该算法有效解决了基于二进制模式特征的数值统计问题。
2026-03-31 09:37:57
478
原创 UVa 12637 30 Minutes or Less
本文分析了Pizza Planet在Gridland城市实现30分钟配送承诺的问题,将其建模为二分图最小权匹配问题。通过计算订单与餐厅间的曼哈顿距离构建成本矩阵,采用匈牙利算法求解。算法复杂度为O(n³),在给定约束条件下高效可行。文章详细阐述了问题转化思路、算法原理和实现细节,并提供了代码实现。最终通过转置矩阵处理N≤R的情况,确保算法正确性,为类似配送优化问题提供了标准解法。
2026-03-30 16:39:13
415
原创 UVa 1380 A Scheduling Problem
本文研究了一个任务调度问题,其中任务之间存在冲突约束和先后顺序约束。通过将问题转化为约束满足问题,提出了一种基于最长有向路径的解法。算法首先计算最长路径长度k,然后通过约束传播技术判断是否存在k天的可行解,否则返回k+1。该方法利用可能颜色集合进行约束传播,在多项式时间内解决问题,适用于n≤200的规模。代码实现验证了该方法的有效性。
2026-03-30 16:38:46
360
原创 UVa 802 Lead or Gold
题目要求判断目标比例溶液能否由若干已知比例溶液的线性组合得到。将每种溶液视为三维向量,问题转化为目标向量是否位于已知向量张成的凸锥内。通过检查单个、两个或三个向量的非负组合能否表示目标向量来求解。算法依次检查所有可能的向量组合,利用点积、叉积和行列式判断是否存在非负系数解。时间复杂度为O(n³),适用于n≤100的情况。最终输出目标比例是否可实现。
2026-03-29 10:12:14
488
原创 UVa 10647 Optimal House Placement
题目要求为Enerous先生寻找最优房屋位置,使得送完所有朋友包裹的总能量消耗最小。能量消耗与移动距离的平方成正比,且一次只能携带一个包裹。通过分析蚂蚁搬家策略,建立数学模型,发现最优位置可能位于朋友家之间或朋友家处。预处理左右能量数组后,遍历候选位置,计算最小能量点。算法时间复杂度为O(n),适用于大规模输入。样例验证了算法的正确性,输出精确到小数点后三位的最优位置。
2026-03-29 10:12:00
405
原创 UVa 11245 Anti-Arithmetic-Sequence
题目要求构造一个无限的反等差数列,其中不存在长度为素数p的等差数列子序列。通过观察p=3时的序列1,2,4,5,10,...发现可将n-1转换为(p-1)进制后解释为p进制数再加1。例如n=10,p=3时,9的二进制1001解释为三进制得28,加1得29。该方法的正确性基于数位限制:p进制每位数字仅取0到p-2,无法构成p长度的等差数列。算法时间复杂度为O(Tlog_{p-1}n),空间O(1)。样例验证表明该方法正确高效。
2026-03-27 08:50:55
435
原创 UVa 12456 Mirror Codes
本文分析了穿孔卡片游戏编码问题。题目要求计算在给定镜像对称进制序列下,非回文编码的数量。通过组合数学方法,首先计算总编码数(各位进制乘积)和回文编码数(前一半进制乘积,奇数位时乘中间位进制),两者的差即为有效游戏数。算法时间复杂度为O(d),适用于32位整数范围内的结果。代码实现简单高效,通过直接计算乘积即可得到答案。关键点在于理解进制对称性和回文编码的特性,从而正确应用组合计数公式求解。
2026-03-27 08:50:38
474
原创 UVa 12574 VOID
题目要求计算满足特定规则的昵称组合数:从N个单词列表中依次选择单词(每个列表可选0或1个单词),且最终昵称至少包含2个单词。解题思路是:首先计算所有可能选择方式的总积S=∏(W_i+1),然后从中减去不合法情况(0个或1个单词的选择)。最终公式为S-1-∑W_i,结果需对1e9+7取模。该算法时间复杂度O(N),适用于大规模输入。
2026-03-26 12:30:41
445
原创 UVa 12702 Dilation
本文介绍了形态学图像处理中的膨胀操作模拟问题。题目要求给定二值图像和结构元素,按照膨胀规则计算输出图像:对于图像中每个值为1的像素,将结构元素原点对齐该位置,并将结构元素中所有1的位置通过逻辑或操作映射到输出图像。关键步骤包括计算结构元素原点坐标、遍历图像像素、处理边界条件以及正确输出格式。文章详细分析了算法流程和实现要点,并提供了C++代码示例。该问题考察了矩阵操作和坐标变换能力,时间复杂度在题目约束下可行,需要注意输出格式的细节处理。
2026-03-26 12:30:26
489
原创 UVa 12942 Sub-Expression Counting
本文提出了一种高效算法,用于计算表达式β中与α结构相同的子树数量。通过设计动态基数多项式哈希函数,将树形结构编码为64位无符号整数,使得结构相同的子树具有相同哈希值。算法采用递归解析表达式,统一处理所有叶子节点,并为内部节点计算复合哈希值。该方案在O(|α|+|β|)时间内完成匹配统计,适用于大规模输入。实验表明,该方法能正确处理深度嵌套表达式和边界情况,如单节点表达式和完全匹配情况。
2026-03-24 09:32:54
716
原创 UVa 11381 Elegant Strings
本文研究了字符串分割问题,要求将字符串T分割为若干子序列,使得所有相邻字符对在字符串S中出现过,并最小化分割数量和总优雅值。通过预处理S中所有长度为2的子串及其首次出现位置,构建优雅值矩阵。将问题转化为有向无环图的最小路径覆盖问题,使用最小费用最大流算法求解。具体步骤包括:1) 预处理S中的字符对信息;2) 构建网络流图;3) 运行最小费用流算法;4) 计算最小分割数和最小总优雅值。算法复杂度为O(n^2),适用于题目给定的数据规模。
2026-03-24 09:32:31
692
原创 UVa 10362 Trains
本文探讨了火车路线最短连接问题,要求在给定多条火车路线时刻表的情况下,找出从起点到终点的所有帕累托最优解(即不存在更优出发时间或更早到达时间的连接)。算法采用动态规划方法,通过状态转移计算各车站在不同时间点的最短旅行时间,并最终筛选出非支配解。输入包含多个测试用例,每个用例输出按出发时间排序的最优连接。关键点包括时间转换处理、状态更新优化以及帕累托前沿的筛选。该算法的时间复杂度约为O(10^8),在实际数据中表现良好。
2026-03-23 15:37:12
513
原创 UVa 12117 ACM Puzzles
这道题目要求用22种特定拼图块填充3×N的矩形,计算不同解法的数量。由于N可能很大(≤2000),需要高效的动态规划算法。关键思路是使用列轮廓线动态规划,通过状态(p,q,r)表示下一列各行的占用情况,并归一化状态以减少复杂度。对于每个N,答案存储在dp[N][0][0][0]中。算法复杂度为O(N×27×22),能够处理题目要求的范围。最终结果需要对10^12取模。
2026-03-23 15:36:55
442
原创 UVa 10597 Right Words
本文探讨了如何利用CYK算法判断给定字符串是否属于某个CNF文法生成的语言。CNF文法规则限定为A→BC或A→a两种形式。CYK算法通过动态规划构建二维表dp[i][j],记录子串s[i...j]可推导出的非终结符。算法首先处理单字符子串,然后逐步扩展至更长子串,最终检查根符号是否在dp[0][n-1]中。该算法时间复杂度为O(n³·|P|),适用于n≤50的情况。实现时需注意输入处理和数据结构设计,特别是对产生式的分类存储。
2026-03-22 10:15:35
475
原创 UVa 11725 Colorful Board
题目要求在一个(M+1)×(N+1)的棋盘上涂色,相邻格子颜色不同且禁止格子不涂色。使用状态压缩动态规划,逐行生成有效颜色状态并检查兼容性。预处理相邻行状态兼容性,通过DFS生成有效状态并建立索引映射,最后累加所有有效方案数。算法复杂度为O(R×4^C),适用于小棋盘(M,N≤6)。
2026-03-22 10:15:20
451
原创 UVa 1392 DNA Regions
本文研究如何寻找两个DNA序列的最长保守区域,定义为满足差异字符数不超过区间长度p%的连续子区间。通过数学转化,将问题转换为寻找满足f(r+1)≤f(l)的最大区间长度,其中f(i)=100×pre[i]-p×i。提出O(n log n)的算法:计算前缀和和f数组后,按f值排序并扫描,维护最小索引来寻找最优解。特殊处理p=100的情况,直接返回整个序列长度。算法高效解决了大规模数据问题,时间复杂度主要由排序步骤决定。
2026-03-21 15:59:44
439
原创 UVa 1524 Hot or Cold
本文介绍了如何计算多项式函数在给定区间内的平均温度值。题目要求根据输入的多项式系数和时间区间,利用积分公式求解平均值。解题关键在于正确实现多项式逐项积分,计算定积分后除以区间长度。算法复杂度为O(n),高效且易于实现。文章详细阐述了数学原理、计算步骤和代码实现,并提供了注意事项以确保结果精度。
2026-03-21 15:59:26
452
原创 UVa 12259 Fair Division
本题要求将总费用p公平分摊给n个人,每人有支付上限a_i,支付必须为整数分。公平性定义为最小化每人支付与平均值p/n差距的最大值,若平局则比较第二大差距等,仍平局则支付能力高者多付,能力相同则序号小者多付。若总支付能力不足则输出IMPOSSIBLE。解题采用二分+贪心策略:首先二分搜索最小的最大差距D,验证是否存在支付方案使所有|支付-p/n|≤D。找到最小D后,计算每人支付区间[L_i,R_i],先支付下限L_i,剩余金额在不超过上限且保持差距≤D的前提下,按能力降序、序号升序分配。
2026-03-20 11:21:00
266
原创 UVa 12404 Trapezium Drawing
本文提出了一种求解梯形顶点坐标的几何构造方法。给定梯形ABCD的底边AB坐标和边长BC、CD、DA,通过平移腰构造辅助三角形,利用余弦定理计算关键角度,再结合向量旋转求解未知顶点坐标。算法步骤如下:1)计算AB长度;2)构造辅助三角形求∠DAB和∠CBA;3)通过向量旋转确定C、D坐标。该方法避免了复杂方程求解,时间复杂度O(1)每用例,精度达1e-6。代码实现简洁高效,适用于逆时针排列的梯形顶点计算问题。
2026-03-20 11:20:41
382
原创 UVa 11766 Racing Car Computer
本文研究了赛车传感器数据验证问题,提出了一种基于区间分析和动态规划的解决方案。通过将每辆车的传感器数据转化为可能的位置区间,并利用动态规划计算最大有效数据量,从而确定最小故障车辆数。算法时间复杂度为O(N²),适用于N≤1000的规模。样例分析验证了方法的正确性,为解决类似约束条件下的逻辑推理问题提供了有效思路。
2026-03-19 10:09:59
728
原创 UVa 11981 Corrupted Friendship
本文分析了一个基于递归邀请规则的题目。初始时,某人拥有N张邀请卡,需分发给N个人,最终每人恰好一张卡。题目要求计算总邀请次数和确定非朋友的对数。关键点在于将邀请过程视为DFS遍历,利用访问顺序推断非朋友关系。总邀请次数为N-1,非朋友对数通过DFS过程中维护未访问节点数来高效计算。算法时间复杂度为O(N),适用于大规模数据。示例展示了不同情况下的计算结果。
2026-03-19 10:09:45
529
USB 存储设备使用痕迹检测和删除工具(C#)
2014-01-19
.Net 安装程序制作
2015-02-13
自动更新程序示例代码-Visual Basic语言编写
2014-01-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅