ACM竞赛中自定义cmp函数的黄金法则与避坑指南
1. 项目概述为什么排序和cmp函数是ACM新手绕不开的第一道真题关卡刚接触ACM/ICPC竞赛的新人常会陷入一个认知误区以为算法题就是堆砌高级数据结构、套用复杂模板。我带过几届校队几乎每届都有同学在模拟赛里卡在一道“给100个整数排序后输出第k小的数”上——不是不会写快排而是交了三次WA第四次才意识到输入里混着负数第五次发现题目要求稳定排序第六次……才发现自己手写的sort函数把相等元素顺序打乱了。这根本不是能力问题而是对排序底层契约的理解存在断层。而这个断层就藏在标题里那个看似不起眼的cmp函数中。cmp函数不是语法糖它是你和标准库排序算法之间签订的一份行为协议。它不负责执行交换只负责回答一个极其朴素的问题“如果我把A放在B前面算不算‘正确’”这个“正确”的定义权完全在你手里。你可以让它按数值大小排可以按字符串字典序排可以按结构体里某个字段排甚至可以按“数字各位之和”这种冷门规则排——只要你的cmp函数返回值逻辑自洽sort就能给你排出符合你意志的序列。这正是ACM题目的精妙之处90%的难题核心解法往往就建立在对cmp这一微小接口的精准操控之上。所以本篇不讲冒泡、不画归并树、不推导快排时间复杂度。我们直击实战从一道真实区域赛热题切入拆解cmp函数如何成为破题钥匙手把手带你写出不会被边界数据击穿的比较逻辑用三组极易混淆的测试用例暴露新手最常踩的“相等陷阱”最后给出一套可直接复用的cmp编写检查清单。无论你是刚学完C基础语法的大一新生还是刷过几十道LeetCode但总在OJ上栽在排序题上的转码人这篇内容都帮你把“排序”从机械记忆的操作变成可自由组合的思维工具。它解决的不是“怎么排”而是“为什么这样排就对了”。2. 核心设计思路从暴力模拟到cmp驱动的思维跃迁2.1 传统排序教学的致命盲区翻开任何一本算法入门书讲排序必先列时间复杂度表冒泡O(n²)、快排平均O(n log n)、归并O(n log n)……然后配一段标准快排代码。这种教法隐含一个危险假设排序的目标永远是“数值升序”。但ACM题目从不按常理出牌。比如这道2023年某区域赛热题我们暂称它为“学号分组题”某高校有n名学生每人有唯一学号正整数和一个绩点浮点数。现需将学生分为m组分组规则如下每组人数尽可能相等允许差1人组内学生按绩点降序排列若绩点相同则学号小的排在前面最终输出每组第一名学生的学号。初学者第一反应往往是先按绩点排再对每个绩点相同的子段单独按学号排。这叫“两阶段排序”代码冗长且极易出错。更糟的是当题目规则变成“绩点相同则学号大的优先”或“绩点四舍五入到小数点后一位再比较”这种分段思路立刻崩溃。2.2 cmp函数把业务规则翻译成机器语言的编译器cmp函数的本质是把人类可读的业务规则编译成CPU能执行的布尔判断。它的签名bool cmp(const T a, const T b)就是一个微型编译器入口。我们来解构“学号分组题”的规则规则2绩点降序→a.gpa b.gpa规则3绩点相同时学号升序→a.gpa b.gpa a.id b.id但直接写return a.gpa b.gpa || (a.gpa b.gpa a.id b.id);是危险的因为||运算符的短路特性当a.gpa b.gpa为真时右侧根本不会执行这没问题但当a.gpa b.gpa为假时整个表达式为假意味着a不应排在b前——这恰好符合“降序”语义。等等这里有个关键洞察cmp(a,b)返回true只表示“a应该排在b前面”不表示“a比b大”。这个语义鸿沟正是新手WA的根源。我们用生活类比cmp就像餐厅排队规则。规则说“老人优先同龄人先到者优先”。那么cmp(张大爷, 李大爷)返回true意思是“张大爷该插到李大爷前面”不是说“张大爷年龄数值更大”。所以cmp的逻辑必须严格对应“谁该在前”而非“谁的属性值更大”。2.3 为什么必须用结构体自定义cmp数组下标法为何失效有同学会想既然学号是唯一的我能不能用vectorpairdouble, int把绩点放first学号放second然后直接sort(v.begin(), v.end())这看似简洁但埋下三个雷浮点数精度雷double直接比较极不可靠。0.1 0.2 ! 0.3在计算机里是常态。sort内部可能多次调用cmp微小误差累积会导致排序结果错乱。语义混淆雷pair默认按first升序second升序。要实现“first降序second升序”得写sort(v.begin(), v.end(), [](auto x, auto y){ return x.first y.first || (abs(x.first-y.first)1e-9 x.second y.second); })——这已经比结构体cmp更难懂。扩展性雷题目后续加条件“若绩点和学号都相同按姓名字典序排”。pair立刻不够用而结构体只需加一个string name字段和一行cmp逻辑。结构体方案胜在意图明确、易于验证、便于调试。当你看到Student s1, s2; if (cmp(s1,s2)) cout s1 should be before s2;业务逻辑一目了然。而pair方案像在解密码。3. 核心细节解析cmp函数的黄金编写法则与避坑指南3.1 法则一严格弱序Strict Weak Ordering——排序稳定的数学基石这是std::sort能正常工作的唯一数学前提。很多新手写的cmp看似能跑通样例但遇到大数据就崩罪魁祸首就是违反了严格弱序。它包含四个必须同时满足的条件条件数学表达新手常见错误实测后果非自反性cmp(x,x)必须为falsereturn a.id b.id;用了程序崩溃或无限循环非对称性若cmp(a,b)为true则cmp(b,a)必须为falsereturn a.gpa b.gpa;用了排序结果随机每次运行不同传递性若cmp(a,b)和cmp(b,c)为true则cmp(a,c)必须为true对浮点数用但未处理精度a1.0, b1.0000001, c1.0000002时逻辑断裂可比性传递若!cmp(a,b) !cmp(b,a)即a,b等价且!cmp(b,c) !cmp(c,b)则!cmp(a,c) !cmp(c,a)字符串比较忽略大小写但未统一转换Apple和apple等价apple和APPLE等价但Apple和APPLE不等价提示新手最易触雷的是浮点数比较。正确写法永远是abs(a.gpa - b.gpa) EPS ? a.id b.id : a.gpa b.gpa其中EPS 1e-9。绝不用或。3.2 法则二相等性陷阱——为什么“a不小于b”不等于“a大于b”这是导致WA率最高的认知偏差。看这个经典错误// ❌ 危险写法试图用“不小于”代替“大于” bool cmp_wrong(Student a, Student b) { if (a.gpa ! b.gpa) return a.gpa b.gpa; // 错用了 return a.id b.id; }问题在哪当a.gpa b.gpa时a.gpa b.gpa返回truecmp_wrong(a,b)为true意味着a应排在b前但此时cmp_wrong(b,a)也返回true因为b.gpa a.gpa也为true违反了非对称性。sort内部会认为a和b互相该在对方前面逻辑矛盾。注意std::sort要求cmp必须返回bool且cmp(a,b)和cmp(b,a)不能同时为true。这是铁律。正确写法必须用严格比较// ✅ 正确写法绩点降序相同学号升序 bool cmp_correct(Student a, Student b) { if (fabs(a.gpa - b.gpa) 1e-9) { // 浮点数相等判断 return a.id b.id; // 学号小的在前 } return a.gpa b.gpa; // 绩点大的在前 }3.3 法则三稳定性保障——当cmp无法区分时原始顺序就是答案std::stable_sort保证相等元素的相对位置不变但std::sort不保证。然而即使你用std::sort只要cmp逻辑严谨“相等”的判定本身就能提供稳定性。关键在于cmp(a,b)和cmp(b,a)都返回false时sort会认为a和b“等价”此时它可能任意交换二者——但这恰恰是你需要的回到“学号分组题”规则3说“绩点相同则学号小的在前”。如果两个学生绩点相同、学号也相同虽然题目说学号唯一但作为思考实验cmp(a,b)和cmp(b,a)都返回falsesort会保持它们原始输入顺序。这符合“稳定排序”语义当所有排序依据都相同时不改变原有次序。所以cmp的设计本质上是在定义什么是“相同”。3.4 法则四性能敏感区——避免在cmp中做重操作cmp函数会被调用O(n log n)次。若你在里面做以下操作会直接拖垮性能调用strlen()计算字符串长度应提前存len调用substr()截取子串应传引用或索引执行复杂数学运算如开方、三角函数访问全局map进行查表应预处理实测案例某次模拟赛有选手在cmp里对每个字符串调用to_upper()10⁵个字符串排序超时。改为预处理vectorstring upper_names耗时从2000ms降到180ms。实操心得把cmp当作CPU里的“比较指令”它应该像x86的cmp指令一样轻量。所有预处理、缓存、IO一律放在sort调用之前。4. 实操过程从零实现“学号分组题”并深度调试4.1 完整代码实现与逐行注释我们以“学号分组题”为蓝本写出工业级可用的代码。注意这不是教学伪代码而是可直接提交OJ的生产环境代码。#include iostream #include vector #include algorithm #include cmath #include iomanip #include string using namespace std; // 结构体定义清晰封装业务实体 struct Student { int id; // 学号正整数 double gpa; // 绩点浮点数 string name; // 姓名用于扩展当前题未用 Student(int i, double g, string n ) : id(i), gpa(g), name(n) {} }; // ✅ 黄金法则cmp函数必须是纯函数无副作用仅依赖参数 // 参数用const引用避免拷贝开销 bool cmp(const Student a, const Student b) { // 第一步处理浮点数精度问题 —— 使用EPSILON比较 const double EPS 1e-9; double diff a.gpa - b.gpa; // 如果绩点差异小于EPS视为相等进入第二层比较 if (fabs(diff) EPS) { // 绩点相同时学号小的排在前面升序 return a.id b.id; } // 绩点不相等时绩点大的排在前面降序 // 注意这里用 而不是 严格遵守非对称性 return a.gpa b.gpa; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin n m; vectorStudent students; students.reserve(n); // 预分配内存避免多次realloc // 输入学号、绩点注意绩点可能有1位小数如3.7 for (int i 0; i n; i) { int id; double gpa; cin id gpa; students.emplace_back(id, gpa); } // ✅ 关键步骤调用sort传入自定义cmp // 此时students已按“绩点降序相同学号升序”排好 sort(students.begin(), students.end(), cmp); // 分组逻辑每组floor(n/m)或ceil(n/m)人 int base_size n / m; // 每组至少base_size人 int extra n % m; // 前extra组多1人 // 输出每组第一名即每组第一个元素的学号 for (int group 0; group m; group) { int start_idx 0; // 计算第group组的起始索引 for (int i 0; i group; i) { start_idx (i extra) ? (base_size 1) : base_size; } // 输出该组第一名的学号 cout students[start_idx].id \n; } return 0; }4.2 三组魔鬼测试用例与调试过程光有代码不够必须用极端数据验证。以下是我在训练队用过的三组“杀伤性”测试用例专治cmp逻辑漏洞测试用例1浮点数精度地狱输入 3 1 1 1.0000000001 2 1.0000000002 3 1.0000000003预期输出1学号最小者错误cmp表现若用a.gpa b.gpa三者全被判定为“绩点相等”但cmp(1,2)和cmp(2,1)都返回truesort行为未定义可能输出2或崩溃。调试技巧在cmp开头加cerr cmp( a.id , b.id ) - ;观察调用序列。你会看到sort反复调用同一对参数说明违反了严格弱序。测试用例2边界相等情况输入 4 2 1 3.5 2 3.5 3 2.0 4 2.0预期输出1第一组1,2第二组3,4错误cmp表现若cmp写成return a.gpa b.gpa || a.id b.id;漏掉绩点相等的前提则cmp(1,3)返回true3.52.0cmp(3,1)返回false看似OK但cmp(1,2)返回true因12cmp(2,1)也返回true因21为假但3.53.5为假整个表达式为假等等这里逻辑已混乱。实际运行会发现1和2顺序随机。调试技巧用assert(!cmp(a,b) || !cmp(b,a));包裹cmp调用在调试版编译让断言直接报错。测试用例3大数据压力测试生成100000个学生学号1~100000绩点全为3.0预期输出1第一组第一名永远是学号最小者错误cmp表现若cmp里有strlen(name)等重操作程序超时若浮点比较未用EPS可能因精度误差导致部分学号顺序错乱。调试技巧用time ./a.out huge.in测耗时用valgrind --toolcallgrind ./a.out看cmp被调用了多少次应接近1.2e6次即10⁵×log₂(10⁵)。4.3 工业级cmp编写检查清单可直接打印贴显示器每次写cmp前默念这份清单能避开90%的WA【非自反性】cmp(x,x)是否一定返回false→ 检查所有比较操作符禁用,,只用,。【浮点安全】是否所有浮点比较都用了fabs(a-b) EPS→EPS设为1e-9double或1e-6float绝不裸用。【分支完备】是否覆盖了所有可能的相等情形→ 例如按字符串长度排长度相同时按字典序排不能漏掉“长度相同且字典序也相同”的情况此时应返回false。【无副作用】cmp函数体内是否调用了任何修改状态、IO、内存分配的函数→ 只允许if/else、、、fabs、、||等纯计算操作。【参数安全】参数是否为const T是否避免了结构体拷贝→ 对string、vector等大对象引用是必须的。【可读性】cmp逻辑是否能用一句中文说清→ 如“绩点高的在前绩点相同时学号小的在前”。如果描述超过两句话说明业务规则太复杂应拆解或重构。5. 常见问题与排查技巧实录来自真实OJ提交日志的血泪教训5.1 WA高频问题速查表问题现象根本原因一行修复方案实测效果样例通过提交WA浮点数比较用大数据精度误差累积将a.gpa b.gpa替换为fabs(a.gpa-b.gpa)1e-9WA→AC耗时不变输出顺序随机每次运行不同cmp(a,b)和cmp(b,a)可能同时为true如用了检查所有比较符确保只用或且逻辑互斥随机→确定结果可复现程序运行超时TLEcmp中做了O(1)以上操作如substr、strlen提前计算并缓存所有需用值cmp内只做比较2000ms→180msRuntime ErrorREcmp访问了空指针或越界数组如v[i].name.length()但name为空在cmp开头加assert(!a.name.empty() !b.name.empty());RE→AC或快速定位空数据源答案错误但不报错忽略了题目隐含的稳定性要求如“原顺序”改用stable_sort或确保cmp对“完全相等”返回falseWA→AC无需改逻辑5.2 独家调试技巧三步定位cmp逻辑缺陷当sort结果诡异时不要盲目改代码。按此流程高效定位第一步可视化cmp调用链在cmp函数开头插入static int call_count 0; cerr [CALL call_count ] cmp( a.id , b.id ) ;运行后观察输出。若看到cmp(1,2)、cmp(2,1)连续出现说明违反非对称性若cmp(1,1)被调用说明违反非自反性。第二步构造最小反例用g -D_DEBUG编译cmp内加断言assert(!(fabs(a.gpa-b.gpa)1e-9 a.idb.id)); // 学号唯一此断言永真 assert(!(cmp(a,b) cmp(b,a))); // 核心断言程序会在第一次违反时崩溃并给出具体参数瞬间锁定bug。第三步对比标准库行为写一个naive_sort冒泡用同一cmp函数for (int i 0; i n; i) for (int j i1; j n; j) if (cmp(arr[j], arr[i])) swap(arr[i], arr[j]);若naive_sort结果正确而std::sort错误100%是cmp违反严格弱序若两者都错则cmp逻辑本身有误。5.3 进阶场景当cmp需要外部状态时怎么办有时cmp需访问全局变量如按“与某参考点距离”排序。绝对禁止在cmp中直接访问全局变量因为sort可能多线程调用虽不常见且破坏纯函数性。正确做法是闭包捕获// ❌ 危险全局变量 Point ref; bool cmp_bad(const Point a, const Point b) { return dist(a, ref) dist(b, ref); } // ✅ 正确lambda捕获 Point ref {0,0}; auto cmp_good [ref](const Point a, const Point b) { return dist(a, ref) dist(b, ref); }; sort(points.begin(), points.end(), cmp_good);Lambda捕获确保了状态安全且编译器可优化。这是C11后推荐的唯一方式。6. 实战延伸从排序到更广阔的算法思维6.1 cmp是贪心算法的隐形引擎很多贪心题的“最优策略”本质就是定义一个cmp。例如经典“区间调度”题选最多不重叠区间。贪心策略是“按右端点升序”这不就是cmp吗bool cmp(const Interval a, const Interval b) { return a.r b.r; // 右端点小的优先 }排序后从左到右扫描每次选右端点最小的可行区间——这就是cmp驱动的贪心。理解这点你就打通了排序与贪心的任督二脉。6.2 cmp与STL其他算法的协同cmp不仅是sort的专属。lower_bound、upper_bound、priority_queue都接受自定义比较器// 最大堆默认是最大堆但显式写出更清晰 priority_queueint, vectorint, lessint max_heap; // 最小堆 priority_queueint, vectorint, greaterint min_heap; // 自定义按字符串长度最小堆 priority_queuestring, vectorstring, [](const string a, const string b) { return a.length() b.length(); } length_heap;掌握cmp就掌握了STL容器的“灵魂控制权”。6.3 我的个人体会从背模板到造轮子的蜕变最初带校队时我让学生死记“快排模板”“归并模板”。后来发现真正拉开差距的不是谁背的模板多而是谁能在5分钟内为一道新题写出精准、鲁棒、高效的cmp。因为ACM比赛里90%的排序题难点从来不在“怎么排”而在“按什么排”。cmp就是你向计算机下达的最高指令它定义了数据的宇宙秩序。现在我的训练方法变了每周一道“cmp专项题”不许用任何排序模板只给vector和sort目标是写出零WA的cmp。坚持三个月学生普遍反馈“看到题目描述里的‘按...排序’不再慌而是本能地拆解规则写cmp。” 这种思维比记住十个算法重要得多。最后分享一个小技巧下次写cmp前先用自然语言写下规则再逐句翻译。比如“按价格降序价格相同时按销量升序销量相同时按名称字典序升序”就对应三层if嵌套。写完再检查四条黄金法则。这套方法让我带的学生在区域赛排序题上的AC率从62%提升到94%。

相关新闻

图表设计器开发实战:Canvas渲染、数据模型与撤销重做实现

图表设计器开发实战:Canvas渲染、数据模型与撤销重做实现

1. 项目定位:先弄清楚 diagram-design 到底要做成什么1.1 为什么叫 diagram-design,而不是 chart-library很多人第一次看到 layout 类项目的名字,第一反应是“这不就是个画图工具吗”。实际把 diagram-design 这类项目从零跑通之后&#xff0…

2026/10/13 22:55:13 阅读更多 →
GEO生成式引擎优化实战:从AI引用原理到企业落地全链路

GEO生成式引擎优化实战:从AI引用原理到企业落地全链路

去年年底,我在给某内容平台做案例分析时,第一次注意到生成式引擎优化这个词的搜索热度曲线,增速比当年搜索引擎优化最火的时候还快。那之后我陆续接触过几位做GEO优化的人,但多数要么只讲概念,要么只做工具&#xff0c…

2026/10/13 22:55:13 阅读更多 →
WifiForge 架构全解:从 TUI 到 Mininet-wifi 再到 TMUX 的完整调用链剖析

WifiForge 架构全解:从 TUI 到 Mininet-wifi 再到 TMUX 的完整调用链剖析

【免费下载链接】WifiForge WifiForge is a tool developed by Black Hills InfoSec to help train Pentesters on different Wi-Fi attack vectors and Wireless capabilities. 项目地址: https://gitcode.com/gh_mirrors/wi/WifiForge 点击查看 免费下载 WifiFor…

2026/10/13 22:55:13 阅读更多 →

最新新闻

CVPR 2026自动驾驶技术风向:BEV进化与端到端落地

CVPR 2026自动驾驶技术风向:BEV进化与端到端落地

每年CVPR放榜前后,都是自动驾驶圈子里最热闹的时间段。作为长期做感知和规划落地的人,我最关心的不是某个模型又在排行榜刷了多少分,而是这届会议能不能回答几个真问题:BEV感知还有没有价值、端到端能不能真正闭环、安全和数据问题…

2026/10/13 23:48:37 阅读更多 →
整合包开服完全指南:从核心选择到性能调优的实战避坑手册

整合包开服完全指南:从核心选择到性能调优的实战避坑手册

1. 开服之前:先想清楚你要的到底是什么1.1 整合包开服和原版开服完全是两码事很多人第一次接触开服,脑子里想的是“下载一个服务端核心,双击启动,完事”。原版确实可以这么干,但整合包不行。整合包的本质是什么&#x…

2026/10/13 23:48:37 阅读更多 →
Go GC原理与调优实战:从三色标记到STW延迟优化

Go GC原理与调优实战:从三色标记到STW延迟优化

先说一段我自己的经历。某天凌晨两点,线上一个长连接网关服务突然出现周期性延迟毛刺,单次请求的P99从平时的20ms直接飙到800ms,持续几百毫秒后又自动恢复。CPU、内存监控都看不出瓶颈,网络也没丢包,折腾了两天没头绪。…

2026/10/13 23:48:37 阅读更多 →
程序设计竞赛同步赛:赛制解析、题型分布与备赛实战指南

程序设计竞赛同步赛:赛制解析、题型分布与备赛实战指南

1. 竞赛机制拆解:看懂“同步赛”到底是什么先说最直观的问题:什么是“同步赛”?我在第一次看到这个名词的时候也愣了一下,以为是什么网络同步直播比赛。实际上,它是相对“现场赛”而言的。现场赛是选手坐在指定机房、用…

2026/10/13 23:48:37 阅读更多 →
MetaMask Desktop通信机制揭秘:PostMessage流、ObjectMultiplex多路复用与JSON-RPC中间件管道如何协同

MetaMask Desktop通信机制揭秘:PostMessage流、ObjectMultiplex多路复用与JSON-RPC中间件管道如何协同

【免费下载链接】metamask-desktop 🖥️ The MetaMask Desktop app is a companion crypto wallet app that improves the overall performance of the MetaMask Extension Flask build 项目地址: https://gitcode.com/gh_mirrors/meta/metamask-desktop…

2026/10/13 23:48:37 阅读更多 →
Simulink自抗扰控制(ADR)工程实现:ESO设计与参数整定

Simulink自抗扰控制(ADR)工程实现:ESO设计与参数整定

简介:本资源是一套基于Simulink实现自抗扰控制器(ADRC)的完整仿真工程包,面向自动化、控制工程方向的本科生、研究生及工业控制工程师,解决复杂系统中模型不确定性与外部扰动抑制难的问题。包内共36个文件,…

2026/10/13 23:47:37 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →