主要记录模拟赛错题。
要查找某一天的记录,Ctrl+F 即可。
P1722 矩阵 II #tag:8-10 下午测试 401
-
错误思路:brute-force。
-
正确思路:dp,令 \(dp_{i,j}\) 表示以 \(i\) 结尾放了 \(j\) 个红色算筹的方案数,初始 \(dp_{0,0}=1\),答案 \(dp_{2n,n}\)(因为最后红、黑色要一样多),转移 \(dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\)(\(i \in [1,2n],j \in [\lceil \frac{i}{2} \rceil,i]\)),因为红色算筹要比黑色多。
-
错误原因:一看到题就不自觉地往爆搜、模拟这方面想,没有牢记“求方案数又不输出方案,考虑 dp”。
P6188 [NOI Online #1 入门组] 文具订购 #tag:8-10 下午测试 401
-
错误思路:枚举 \(a,b,c\),选最优方案。由于计算 \(c\) 时会有浮点数误差,导致 WA。
-
正确思路:从大到小枚举成套数(共 \(\frac{n}{14}\) 套)。要求物品总数尽可能大,则尽量多买笔记本。若余数为 \(0\),直接加上能买的数量即可;若余数为 \(1\),退掉一本笔记本换一支笔即可;若余数为 \(2\),退掉两本笔记本换一支圆珠笔即可。
-
错误原因:没有考虑浮点数误差,也没有思考更简易的枚举方式。
-
总结:
-
尽量不要用到浮点数参与运算,能化成整数的就化成整数。
-
要训练自己往简洁的方式想。
-
当某题情况较少时,直接分讨。
-
P2678 [NOIP2015 提高组] 跳石头 #tag:8-10 下午测试 401
错误思路:二分,check 时只检查了相邻两块石头的距离是否小于 \(x\),是就移走当前石头。
正确思路:有可能移走当前石头后距离仍小于 \(x\),这时需要接着移。
错误原因:做过的题没有重复巩固。check 思路没有理清。以后记得在草稿上写好再敲代码。
P2040 打开所有的灯 #tag:8-10 下午测试 401
错误思路:dfs,没有标记。
正确思路:应当标记每个点,因为一个点只能开关至多一次,再多了就无效。
错误原因:没有想清楚所有要点就开写。
P2029 跳舞 #tag:8-10 下午测试 401
错误思路 / 原因:没写。
正确思路:dp,令 \(dp_{i,j}\) 表示以 \(i\) 结尾跳了 \(j\) 步的最大收益,初始 \(dp_{i,0}=dp_{i-1,0}-s_i\),答案 \(\max\{dp_{n,i}\}\),转移 \(dp_{i,j}=\max(dp_{i-1,j-1}+s_i,dp_{i-1,j}-s_i)\),当 \(j \bmod t=0\) 时,\(dp_{i,j}=\max(dp_{i-1,j-1}+s_i+b_i)\)。
总结:求最大收益又不输出方案,考虑 dp,要敢想、敢写 dp。
B3626 跳跃机器人 #tag:8-17 下午测试 401
错误思路:dp,但题目有后效性。
正确思路:bfs。
总结:想 dp,先要考虑先决条件:是否有后效性 / 最优子结构。
B3618 寻找团伙 #tag:8-17 下午测试 401
错误思路:dfs,但写得过于复杂导致莫名错误。
正确思路:dfs,将每个人的能力表示为二进制数,则权重之和即为所有人的异或和。
总结:
-
看到二次幂,想到二进制表示。
-
看到奇为 \(0\),偶为 \(1\),想到异或。
-
还是要训练自己不断往简洁的方面想。
P3612 [USACO17JAN] Secret Cow Code S #tag:8-17 下午测试 401
错误思路:brute-force。
正确思路:因为字符串每次都是复制出来的,所以第 \(n\) 个字符一定能对应到第一个字符串的某个字符。于是递归分段处理(实现不能用真的递归,常数会很大),\(n<\frac{len}{2}\) 直接继续,\(n>\frac{n}{2}\) 则判断是否为第一个字符,若是则 \(n=\frac{len}{2}\),否则 \(n=n-\frac{len}{2}-1\)(\(n\) 表示当前下标,\(len\) 表示当前长度)。
总结:
-
处理字符串复制的题目,考虑递归分段处理。
-
实现时不能用递归,常数很大。
P2072 宗教问题 #tag:8-17 下午测试 401
错误思路:没写。
正确思路:dp,令 \(dp_i/f_i\) 表示以 \(i\) 结尾的最少集体数 / 最小危险值。初始 \(dp_0=f_0=0\) 其余 \(\infty\)。转移 \(dp_i=\min(dp_j+1,dp_i),f_i=\min(f_j+cnt,f_i)\)(\(cnt\) 表示当前 \(i \sim j\) 的宗教种类数,转移时顺便维护即可),注意 \(j\) 需要倒序 \(i \to 1\) 枚举,因为正序枚举可能没到 \(i\) 时 \(cnt\) 就大于 \(k\) 了,从而没有转移。答案:\(dp_n,f_n\)
总结:
-
最值问题想 dp。
-
注意诸如循环顺序这种细节。
P1326 足球 #tag:8-17 下午测试 401
错误思路:没写。
正确思路:结论题。要求赢的分最大,则只可能输一场或不输(不输要满足 \(s \ge t\)),输的分最大同理,也只能赢一场或不赢(不赢要满足 \(t \ge s\)),分讨即可,具体见代码。
总结:看到 \(10^9\) 数据范围,考虑是不是结论题。
P2207 Photo #tag:8-17 下午测试 401
错误思路:没写。
正确思路:我们可以把问题想像成拍了一张 \(1 \sim n\) 区间的照片,再在中间分割,求分割的最小次数,这便转化为了区间选点问题。对于每个分割点,我都想使其被更多的区间包含,这样分割点会更少。于是我们将区间按右端点从小到大排序,每次选右端点前面那个即可(不能选右端点不然分了等于没分)。
总结:学到了区间选点模型,以后看到区间问题可以尝试将其转化为此模型。
P4379 [USACO18OPEN] Lemonade Line S #tag:8-18 下午测试 401
错误思路:没写。
正确思路:贪心,将每头牛按 \(a_i\) 从大到小排序,依次放置奶牛到队列即可。从大到小排序是因为 \(a_i\) 更大的奶牛更容易进队,从而使后面 \(a_i\) 小的奶牛更不容易进队,使得队列牛数更小。
总结:
-
求最值问题,考虑 dp 未果,或感觉比较神秘的,考虑贪心。
-
考虑贪心,先考虑排序。
P3817 小A的糖果 #tag:8-18 下午测试 401
错误思路:对于每对 \(a_i,a_{i+1}\),若 \(a_i+a_{i+1}>x\),则对 \(a_{i+1}\) 进行操作。
错误原因:\(a_{i+1}\) 可能不够减,并且没开 long long
。
正确思路:\(a_{i+1}\) 不够减就减 \(a_i\)。
总结:以后要仔细考虑特殊 / 边界情况,并多用边界数据进行测试。
P2772 寻找平面上的极大点 #tag:8-18 下午测试 401
错误思路:brute-force。
正确思路:按 \(x\) 为第一关键字,\(y\) 为第二关键字排序。对于每个点,只有它前面的点才有可能支配它,而他们的 \(x\) 一定大于当前点的 \(x\)。动态维护 \(y\) 最大值并比较即可。
总结:以两维作条件的题,可以固定一维,再处理另一维。
P1394 山上的国度 #tag:8-18 下午测试 401
错误思路:没写完。
正确思路:用并查集双向合并再判断所有点是否在一个集合即可。注意合并时只有 \(u\) 与 \(v\) 的根可以流通,并不代表 \(u\) 的根与 \(v\) 的根也可以流通。
总结:并查集不能一味照板子写,要思考哪里变化了。其他算法也是。
P1395 会议 #tag:8-18 下午测试 401
错误思路:没有输出编号最小的。
正确思路:用 vector
记录重心并排序。
总结:审题很重要。
P2240 【深基12.例1】部分背包问题 #tag:8-19 下午测试 401
错误思路:贪心,但是排序时 cmp 写成了除法导致精度误差,并且没有判断最后是否满了就直接加。
正确思路:贪心,按性价比(即单位价格)排序即可。这是因为分割金币以后性价比不变,选性价比更高的一定更优。
总结:
-
慎用除法、浮点数,避免精度误差!!!
-
思路一定要先打好草稿!!!!!
P5650 基础字符串练习题 #tag:8-19 下午测试 401
错误思路:brute-force。
正确思路:\(1\) 转成 \(-1\),\(0\) 转成 \(1\),然后跑最大子段和。
总结:要牢记最大子段和的套路。
P6023 走路 #tag:8-19 下午测试 401
错误思路:没写。
正确思路:结论题。对于任意两天,设它们走的步数,已经获得的分数以及接下来每步可得的积分分别为 \(a_1,a_2,b_1,b_2,c_1,c_2\),不妨设 \(c_1 \ge c_2\),则显然我们有 \(b_1+a_2 \times c_1 \ge b_1+a_2 \times c_2 \ge b_1+b_2\)。(\(a_2 \times c_2 \ge b_2\) 是因为后面可能还有激励)。于是我们发现将所有步数放在一天走完即可达到最优。
总结:看到极大数据范围,考虑结论题。
P6014 [CSGRound3] 斗牛 #tag:8-19 下午测试 401
错误思路:brute-force。
正确思路:枚举两个数的余数,易得若存在 \(n-2\) 个数的和为 \(10\) 的倍数,则总点数之和一定与剩下两个数的和在模 \(k\) 意义下同余。根据这个判断即可,具体见代码。
总结:做题找数据范围小的地方入手(本题余数只有 \(1 \sim 10\))。
P2420 让我们异或吧 #tag:8-19 下午测试 401
错误思路:没写完。
正确思路:倍增维护树上前缀和即可(就是预处理 LCA 的部分顺便维护即可)。
B3828 [NICA #2] 优秀正整数 #tag:8-20 下午测试 401
错误思路:枚举 \(i\),判断 \(i \times i\) 是否为优秀正整数即可。
正确思路:同错误思路。
错误原因:取模次数太少。
总结:要取模的题,每一步都得取模。
P1878 舞蹈课 #tag:8-20 下午测试 401
错误思路:没写。
正确思路:用小根堆维护每一对跳舞的人即可,具体实现细节见代码。
总结:想出 brute-force 之后,要思考哪部分可以优化,再选较容易优化的部分优化。如这题就是选绝对值最小的可以用小根堆维护。
P6092 [CEOI2012] 工作规划 #tag:8-20 下午测试 401
错误思路:没写。
正确思路:二分所需机器数,若没安排完且当前机器不会超时就安排上,否则取完成任务时间最靠前的机器做(前提是也不超时)即可,其中第二个过程可以用小根堆维护。
总结:二分 + 贪心 以及 小根堆优化 都是普及组模拟赛的参考点,必须牢记。
B3752 [信息与未来 2019] 新斐波那契数列 #tag:8-22 下午测试 401
错误思路:没写。
正确思路:发现所有新斐波那契数列里的数都可以表示为形如 \(k \times a+c\) 的表达式,然后又发现项数大约是 \(\log\) 级别的,于是枚举 \(n\),递推计算 \(k_i,c_i\),若当前 \(n\) 满足 \(k_n \times a+c_n=x\),则输出即可。
总结:\(10^9\) 数据范围,考虑数学结论!!!(找规律)
P8669 [蓝桥杯 2018 省 B] 乘积最大 #tag:8-22 下午测试 401
错误思路:dp,但没有最优子结构。
正确思路:贪心,\(k\) 为偶数就两个两个选,每次看选两正数还是两负数哪个更大。为奇数时,若最大的一个是正数则直接选它,否则说明全是负数,每次选两个时要比较哪个更小(因为第一个数是负数)。
总结:
-
dp 要考虑先决条件。
-
dp 不行时就考虑贪心。
P1141 01迷宫 #tag:8-22 下午测试 401
错误思路:dfs 找联通块,但是看错题了,以为是 \(n \times m\) 的矩阵。
正确思路:同错误思路。
总结:审题!!!把题目条件列在草稿纸上。
P2700 逐个击破 #tag:8-22 下午测试 401
错误思路:对于每条连接敌对城市的边断掉。但是有可能存在比该边更小的边,断掉它以后两个敌对城市也不在一个联通块里了。这很容易 hack。
正确思路:容易发现将 \(k\) 个敌对城市不联通,需要断掉 \(k-1\) 条边。考虑将边按边权从小到大排序,依次考虑所有边并尝试断掉,同时使用并查集维护联通性。但是并查集不支持删除,于是正难则反,将边按边权从大到小排序,考虑加 \(n-k\) 条边即可。
总结:学到了正难则反思想。
B3694 数列离散化 #tag:8-23 下午测试 401
错误原因:没开 map
。
总结:考试一定要留出 \(15\) 分钟检查。
P2802 回家 #tag:8-23 下午测试 401
错误思路:纯 DFS。
正确思路:DFS + 剪枝,或 BFS。
总结:搜索尽量用 BFS,用 DFS 就一定得剪枝。
P2085 最小函数值 #tag:8-23 下午测试 401
错误思路:枚举 \(x\),每次取 \(F_i(x)\) 的最小值,但是这是错的,因为假设第一轮选了 \(F_3(1)\),但有可能存在 \(F_i(1)<F_3(2)\) 且 \(i \neq 3\),因此不能直接跳过。
正确思路:用优先队列维护 \(F_i(x)\) 的最小值,每次弹出队头,并插入下一个即可。
总结:当觉得问题过于简单时,想一想是不是错了。
P1661 扩散 #tag:8-23 下午测试 401
错误思路:floyd,但是抄板子。
正确思路:floyd / 二分 + dsu。
总结:不能一味抄板子,要想想哪里要改动的。
P1658 购物 #tag:8-23 下午测试 401
错误思路:dp。
正确思路:贪心。
很容易发现我们第一个一定选 \(1\),如果连 \(1\) 都不选,那么 \(1\) 一定凑不出,于是无解。
接着手玩:
1 1 -> 1 2
1 2 -> 1 2 3
1 3 -> 1 3 4
我们发现,前两组都能凑出连续的数,到第三组就凑不出了。
这是因为 \(3>2\),因此 \(2\) 无法被凑出。
更一般的,我们发现,令 \(sum\) 表示目前序列长度,则若当前要添加的数 \(> sum+1\),则一定不行,否则一定可以。
继续,对于可行的数,它们对序列长度的贡献即为他们本身。
于是我们将 \(a[]\) 排序,每次从大到小枚举直到可行,然后添加之即可。
总结:dp 不行想贪心,贪心就要玩样例。
P1165 日志分析 #tag:8-24 下午测试 401
错误思路:优先队列 + 栈,待查错。
正确思路:维护 \(dp_i\) 表示栈顶编号 \(i\) 的最大值,每次 \(dp_i=\max(dp_{i-1},x)\)(\(x\) 为插入的数)即可。
总结:对于普及组数据结构题,考虑维护前缀和 / 积 / 最值等等。
P1258 小车问题 #tag:8-24 下午测试 401
错误思路:推式子,但是推错了。
正确思路:二分第一个人坐车到的点,再计算两人分别到达目的地的时间,若第一个人时间 \(>\) 第二个人时间则它要坐少一会车,猜小,否则猜大即可。
总结:对于数学问题(特别是这种行程问题),一定要画图再推式子。如果推出来的式子太复杂,则要审视是否错了。
P2193 HXY和序列 #tag:8-24 下午测试 401
错误思路:dfs。
正确思路:dp,令 \(dp_{i,j}\) 表示以 \(i\) 结尾最后一个数选了 \(j\) 的方案数。初始:\(dp_{1,i}=1\),答案:\(dp_{n,i}\),转移:\(dp_{i,j}=dp_{i,j}+dp_{i-1,k}\)(\(k\) 为 \(j\) 的因数)。
总结:能 dfs 的,一般能 dp。求方案数,想 dp。
P3915 树的分解 #tag:8-24 下午测试 401
错误思路:没写。
正确思路:维护子树大小,等于 \(k\) 的就切掉,最后判断 \(siz_1\) 是否为 \(0\) 即可。
总结:要敢想敢写。感觉是对的就一定先写,不要犹豫。
P1589 泥泞路 #tag:8-25 下午测试 401
错误思路:模拟,若上次长度有余数则当前长度 \(-1\),若有重叠则减重叠部分。但是这一次的起点应该是上一次实际的终点(不一定是输入的,因为可能有余数),我没有记录。
正确思路:记录这个即可。
总结:这题有三种情况:全包含、有重叠、无重叠。写代码之前应当把这三种情况一一列举出来分别考虑,并且注意有余数、记录实际终点等细节。总之,要勤动笔,尤其是这种模拟题。
P3913 车的攻击 #tag:8-25 下午测试 401
错误思路:记录每行、列是否计算过,没有就加 \(n-1\),否则加 \(1\),但是有可能某个车的位置会算多次。
正确思路:整体思想,将行、列去重,得到总个数 \(x,y\),则答案即为 \((x+y) \times n-x \times y\)。
总结:单独难以处理时,考虑整体处理。
P2694 接金币 #tag:8-25 下午测试 401
错误思路:没有考虑要等金币落下的情况。
正确思路:考虑即可。
总结:打草稿!
B3874 [GESP202309 六级] 小杨的握手问题 #tag:8-25 下午测试 401
错误思路:树状数组求正序对,但是没开 ll。
正确思路:开 ll 即可。
总结:逆序对开 ll!
P3884 [JLOI2009] 二叉树问题 #tag:8-25 下午测试 401
错误思路:求 LCA 写挂了,第一次跳的时候没有让 \(x,y\) 跳到同一层(即写成了 dep[dp[x][i]]>dep[y]
)。
正确思路:改成 >=
即可。
总结:LCA 板子背的不熟。还得背几遍。
P2782 友好城市 #tag:8-25 下午测试 401
错误思路:没写。
正确思路:\(O(n \log n)\) 求最长上升子序列的板子。维护 \(dp_i\) 表示以 \(i\) 结尾的最长上升子序列的最小末尾值,对于每个 \(i\),二分出最小的满足 \(dp_x < y_i\) 的最小 \(x\),其中 \(y_i\) 为北岸友好城市的坐标(因为 \(dp_x\) 单调递增,因此可以二分),尝试让 \(y_i\) 接在 \(dp_l\) 后面并更新最长上升子序列的长度即可。
P1464 Function #tag:9-25 下午测试 401
错误思路:对于读入结束的条件判断错误(写成了 a!=-1&&b!=-1&&c!=-1
)。
总结:审题!!!以后防范此类错误的发生。
P1095 [NOIP2007 普及组] 守望者的逃离 #tag:9-25 下午测试 401
错误思路:没写。
正确思路:对于全用闪烁魔法的情况做一遍 dp,然后看是否能增加一些跑步来使行走的路程更长。
总结:对于这种有多种情况的 dp,可以先全使用一种,再在此基础上考虑另一种。
P1334 瑞瑞的木板 #tag:9-25 下午测试 401
错误思路:直接按木板长度从大到小排序,然后依次切割。
错误原因:不一定当前的木板就是最长的,有可能其余更小的木板拼成的长木板比当前木板更长。
正确思路:将合并果子的套路反过来就成了本题。
总结:合并果子的套路十分常见,以后遇到合并 / 拆分且价值 / 体力是两个元素的和的题,考虑这种套路。
P1363 幻象迷宫 #tag:9-25 下午测试 401
错误思路:搜索,若将地图内的点全走完就判定为合法。
错误原因:显然很容易被 hack。
正确思路:因为矩阵是重复的,所以考虑多带两个参数,即当前矩阵的编号 \((xx,yy)\),若能走到了一个点,它已经被走过且与上次到达的矩阵编号不同,说明它绕了一圈回到了原点,即为合法。
总结:想出了一个思路必须尝试证明,对于这种显然错误的思路就不要再尝试写出来了。
P1348 Couple number #tag:9-26 下午测试 401
错误思路:没写。
正确思路:
\[n=x^2-y^2=(x+y)(x-y) \]当 \(x,y\) 奇偶性不相同时,\(x+y,x-y\) 都为奇,乘起来也为奇。
否则,\(x+y,x-y\) 都为偶,乘起来为 \(4\) 的倍数。
综上,当 \(n\) 为奇数或为 \(4\) 的倍数时,它就是 Couple number。
总结:对于这种式子要更敏感一些,然后尝试从奇偶性发现规律。
标签:测试,错误,错题,tag,401,思路,dp From: https://www.cnblogs.com/XOF-0-0/p/18363875