PTA
文章平均质量分 88
ab123768
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
1004 To Buy or Not to Buy - Hard Version
int new_extra = cur_extra; // 记录购买当前商店后的额外量 int new_rest_need = rest_need; // 记录购买后剩余需求 vector<int> temp_need = cur_need; // 临时副本用于回溯 // 购买第i个商店的珠子,更新需求和额外量 for (auto& [color, count] : shop_bead[i]) { if (temp_need[color] > 0) { // 满足部分需求 int原创 2026-04-08 12:00:17 · 378 阅读 · 0 评论 -
PAT 1002 Business 学习笔记
PAT 1002 Business 问题解析 该问题要求选择多个项目以获得最大利润,每个项目具有利润P、持续时间L和截止日期D。关键点在于项目必须连续完成且不超期。 解题思路 问题分析:转化为带截止时间的01背包问题 核心算法: 按截止日期排序项目 使用动态规划,状态dp[i][j]表示前i个项目在j天内获得的最大利润 优化方案: 采用滚动数组降低空间复杂度 合理设置时间上限 实现要点 项目排序确保截止时间早的优先处理 状态转移考虑三种情况:时间不足、可做项目、超期情况 最终遍历所有时间状态取最大值 该问题原创 2026-04-04 05:34:09 · 274 阅读 · 0 评论 -
PAT 1001 Battle Over Cities - Hard Version 笔记
PAT 1001 Battle Over Cities - Hard Version 摘要 该题考察在战争背景下,当某个城市被攻占后,如何以最小代价修复高速公路使剩余城市保持连通。输入包含N个城市和M条高速公路信息(每条路有修复代价和使用状态)。核心算法是枚举每个城市被攻占的情况,使用Kruskal算法结合并查集计算剩余城市连通的最小修复代价。具体步骤包括:预处理边(优先使用完好道路),枚举每个城市作为被攻占点,构建最小生成树并统计代价,最终输出需要最关注的城市(修复代价最大的)。若所有城市被攻占后都不需修原创 2026-04-04 05:31:22 · 411 阅读 · 0 评论 -
选修课(小林选课规划)学习笔记
本文研究了小林选课规划问题:在k个学期内选修n门核心课程,要求每门课程至少被选修一次。通过组合数学分析,将问题转化为集合覆盖计数,并应用容斥原理和二项式定理,得出答案为$(2^k - 1)^n \mod 998244353$。验证了样例的正确性,提供了C++实现代码,并分析了时间/空间复杂度。核心结论可概括为:每门课有$2^k$种选法,排除全不选的情况后,n门课的组合数为$(2^k-1)^n$。该解法高效简洁,时间复杂度为$O(\log k + \log n)$。原创 2026-04-04 05:24:56 · 216 阅读 · 0 评论 -
取石子游戏 学习笔记
取石子游戏学习摘要 问题描述: Alice和Bob轮流从n个石子堆中取1个或任意质数个石子,取走最后一个石子者胜。Alice先手,判断其必胜策略。 核心规律: 当n是4的倍数时先手必败,否则先手必胜。 证明思路: 基础情况验证(n=0-4) 归纳法证明: 4m:无论取1/2/3都会给对手非4倍数 非4倍数:总能取1/2/3使对手得到4倍数 复杂度: 每组数据O(1)时间判断 记忆口诀: "模四为零Bob赢,模四非零Alice胜" 代码实现: 直接判断n%4即可输出胜负原创 2026-04-04 05:21:24 · 384 阅读 · 0 评论 -
能源矩阵 完整题解(C++版 核心笔记)
摘要:本文介绍了解决能源矩阵问题的动态规划方法。题目要求在n×n的0/1矩阵中统计所有边长为k的全1正方形数量。核心解法使用动态规划:定义dp[i][j]为以(i,j)为右下角的最大全1正方形边长,状态转移方程为当matrix[i][j]=1时,dp[i][j]等于相邻三个位置最小值加1。通过cnt数组统计边长≥l的正方形数,再用差分计算恰好边长为l的数量。该算法时间复杂度O(n²),适用于n=2000的数据规模。C++实现包含输入优化和下标处理细节,可推广到类似矩阵统计问题。原创 2026-04-04 05:17:32 · 325 阅读 · 0 评论 -
昆仑山脉山峰海拔还原问题
本文探讨了昆仑山脉山峰海拔还原问题。题目给定n座山峰的观测记录序列a_i,要求还原山峰的海拔关系并输出从低到高的山峰编号。关键解法是利用并查集进行逆序高度分配:从最高山峰开始,为每座山分配比a_i对应山峰更高的第一个可用高度。算法通过路径压缩优化查找过程,时间复杂度O(n),完美适配大数据规模。样例执行过程验证了该方法的正确性,最终输出符合海拔从低到高的编号顺序。该方案高效解决了山峰高度排列问题,适用于n≤10^5的大数据场景。原创 2026-04-03 21:15:48 · 238 阅读 · 0 评论 -
校验码 笔记
题目要求验证信息传输中的校验码是否正确。给定字符串S(用下划线连接单词)和校验码T,判断S中各单词首字母组成的缩写是否与T匹配。输入多组数据,每组输出Yes/No。核心解法:1)手动遍历S,提取下划线后首字母;2)使用stringstream按_分割单词取首字母。注意cin.ignore()处理输入缓冲区的换行符问题。时间复杂度O(|S|),适用于小规模数据。原创 2026-04-03 20:31:31 · 245 阅读 · 0 评论 -
C++ size() 与 length() 核心笔记
C++中size()与length()的核心区别与用法总结: length()是字符串专属函数,size()是STL容器通用函数,两者在string类中完全等价; vector/map等容器只能用size(),不能用length(); 原生数组既不能用size()也不能用length(),需用sizeof计算; 使用时必须加括号(),否则会编译错误。 关键记忆点: 字符串两者通用 容器只用size 数组都不支持 正确用法示例: string s = "abc"; // s.size()或原创 2026-04-03 20:27:59 · 83 阅读 · 0 评论 -
C++ upper_bound / lower_bound 与迭代器 学习笔记
本文介绍了C++中upper_bound和lower_bound函数的使用方法及其与迭代器的关系。主要内容包括:迭代器概念(通用位置标记,适用于所有容器)、两个函数的区别(lower_bound返回第一个≥x的位置,upper_bound返回第一个>x的位置)、四大常用功能(计算≤x、<x、≥x、>x的元素个数)、典型应用场景(统计方案数、判断元素存在)、降序数组的特殊用法(需加greater参数)以及使用口诀。文章强调迭代器是STL通用接口,两个函数都基于二分查找且要求数组已排序。原创 2026-04-03 20:19:58 · 170 阅读 · 0 评论 -
绝版图书购书方案问题(折半枚举 / Meet-in-the-Middle)
本文介绍了绝版图书购书方案问题的解法。题目要求计算在不超过预算的情况下,购买n本图书的所有可能方案数。由于n≤40但预算可能高达10^9,传统背包算法不适用。采用折半枚举(Meet-in-the-Middle)策略,将图书分成两半,分别枚举所有子集和,再通过排序和二分查找合并结果。这种方法将时间复杂度从O(2^n)降低到O(2^(n/2)),有效解决了大规模数据问题。样例分析展示了8种合法方案,包括不购买的情况。代码实现详细注释了分治、枚举和二分查找的过程。该算法特别适合n较小但m较大的情况。原创 2026-04-03 19:50:39 · 440 阅读 · 0 评论 -
邻接表 `vector<pair<int, int>>` 超详细完整版笔记
邻接表使用vector<pair<int,int>>存储图结构,基础定义为静态数组graph[MAXN],每个元素graph[u]存储从节点u出发的出边(终点v和边权w)。支持有向图、无向图、重边和自环,存储顺序严格按输入顺序。内存布局为块内连续、块间离散,数据存储在堆上。遍历方式灵活,支持正反向遍历。邻接表相比邻接矩阵更节省空间(O(m)),适合稀疏图,但查询边需O(deg(u))时间。常见操作包括建图、遍历、查询、修改、排序和去重,需注意无向图需存双向边、节点越界和栈溢出等问题。原创 2026-04-02 16:59:07 · 434 阅读 · 0 评论 -
L2-001 紧急救援
本文介绍了使用Dijkstra算法解决城市紧急救援路径规划问题的两种实现方法。问题要求在最短路径的基础上,同时考虑召集最多救援队数量,并输出路径详情。朴素版Dijkstra适合城市数≤500的情况,通过邻接表存储图结构,维护距离、路径数、救援队数等数组,时间复杂度O(n²)。堆优化版则使用优先队列提升效率,适合更大规模数据。两种方法都包含路径记录和最优解判断逻辑,最终输出最短路径数量、最大救援队数以及具体路径。示例代码完整展示了算法实现细节,包括邻接表构建、松弛操作和路径回溯等关键步骤。原创 2026-04-02 16:39:14 · 325 阅读 · 0 评论 -
L1-102 兰州牛肉面、 L1-103 整数的持续性、L1-104 九宫格
本文包含三个编程题解:L1-102统计牛肉面销售情况,L1-103计算整数持续性,L1-104验证九宫格规则。L1-102通过记录各品种销量和价格计算总营业额;L1-103通过数字乘积循环计算持续性,找出区间内持续性最长的数;L1-104检查9×9矩阵是否满足行、列和3×3宫格内数字1-9不重复的条件。每个问题都给出了输入输出样例和对应的代码实现。原创 2026-04-01 17:34:15 · 564 阅读 · 0 评论 -
C++ vector 超全用法整理
本文全面整理了C++ vector容器的使用方法,内容包括:头文件与定义方式、元素访问方法、添加/删除元素操作、大小与容量管理、多种遍历方式、排序/去重/反转等算法操作、查找与比较、二维vector定义以及常用技巧。特别针对刷题场景提供了高效用法建议,如emplace_back原地构造、快速清空内存等。最后附上vector所有成员函数的速查表,可作为开发参考手册使用。全文采用代码示例与文字说明相结合的方式,便于快速掌握vector的核心功能。原创 2026-04-01 13:24:49 · 142 阅读 · 0 评论 -
L1-101 别再来这么多猫娘了!
本文实现了一个内容审查系统,用于检测和替换文本中的违禁词。系统首先读取N个违禁词和阈值k,然后对待检查文本进行扫描。若违禁词出现次数小于k,则将违禁词替换为"<censored>";否则输出违禁词数量及警告信息。代码通过find()定位违禁词,用replace()实现替换,并采用临时标记"_"避免重复处理。核心函数包括输入处理、字符串查找替换和条件判断,最终根据违禁词数量输出相应结果。原创 2026-03-29 20:59:44 · 544 阅读 · 0 评论 -
L1-086 斯德哥尔摩火车上的题、L1-087机工士姆斯塔迪奥
本文包含两道编程题解:1) L1-086题要求比较两个数字字符串通过特定算法处理后是否输出相同结果,算法是相邻数字奇偶性相同时取较大值连接成新字符串。2) L1-087题计算BOSS攻击后安全格子数,通过标记被攻击行/列,用公式(总行数-被攻击行数)×(总列数-被攻击列数)求解。两题均给出C++实现代码,涉及字符串处理、数组标记和数学计算等知识点。原创 2026-03-28 20:21:03 · 357 阅读 · 0 评论 -
L1-012 计算指数、L1-013 计算阶乘和、 L1-014 简单题、 L1-015 跟奥巴马一起画方块、 L1-016 查验身份证
本文摘要介绍了5道基础编程题目及解法: L1-012 计算指数:输入n,输出2^n的值,使用pow函数计算 L1-013 计算阶乘和:计算1!到N!的和,通过循环累加阶乘结果 L1-014 简单题:无输入,直接输出固定字符串 L1-015 画方块:根据边长N和字符C输出正方形,行数取N/2四舍五入 L1-016 查验身份证:检查前17位数字及校验码,使用权重数组和模11验证 所有题目均提供C++代码实现,涉及基础数学运算、循环控制、字符串处理等编程基础知识点。原创 2026-03-28 13:44:23 · 619 阅读 · 0 评论 -
L1-011 A-B
本文介绍了L1-011 A-B字符串处理题的解题思路和C++实现方法。题目要求从字符串A中删除所有出现在字符串B中的字符。解决方案采用getline读取完整输入字符串,通过unordered_set存储要删除的字符实现O(1)快速查找。代码遍历字符串A,仅输出不在集合中的字符。文章详细讲解了getline函数读取带空格字符串的特性,以及unordered_set的定义、初始化、查找等核心操作,特别强调了范围for循环和迭代器遍历两种方式。该方法高效简洁,适用于处理大规模字符串数据。原创 2026-03-28 12:42:31 · 362 阅读 · 0 评论 -
PTA乙级-1002 写出这个数
本文介绍了一个处理超大正整数并输出数字之和拼音的程序。程序通过字符串存储超大数避免数值溢出,计算各位数字之和后转换为汉语拼音输出。关键点包括:1) 使用字符串处理超过整数范围的数字;2) 通过c - '0'将字符转换为数字;3) 采用"非首位前加空格"的格式控制确保输出规范;4) 使用数组实现数字到拼音的高效映射。程序结构清晰,分为输入处理、求和计算和拼音输出三个模块,通过引用传递和常量修饰提升效率和安全性。该方案适用于需要处理超大数字并格式化输出的场景。原创 2026-02-07 13:34:30 · 861 阅读 · 0 评论 -
PTA乙级-1001 害死人不偿命的(3n+1)猜想
卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?这行代码是 C++ 标准输出流的核心用法,专门把计算好的。,完全匹配题目「输出从n到1的步数」的要求。读取用户输入的整数,赋值给变量。原创 2026-02-06 00:19:33 · 1068 阅读 · 0 评论
分享