07 2025 档案
摘要:本题做法 0-1 背包 DP。 思路 这道题是 0-1 背包 DP 的变种,与模板的区别就是价值等于代价。 其他的跟 0-1 背包 DP 的模板没什么区别的,直接按照模板打上去就行了。 代码 #include<bits/stdc++.h> typedef long long ll; typedef
阅读全文
摘要:本题做法 0-1 背包 DP。 思路 这道题是一道变形的 0-1 背包 DP 好题。 题目中说,砝码可以放在左边,也可以放在右边。我们令左盘的砝码重量始终大于或等于右盘的重量,设左盘的重量为 \(m_l\),右盘的重量为 \(m_r\),物品的重量为 \(m_t\)。则有: \[m_l=m_r+m_
阅读全文
摘要:本题做法 0-1 背包 DP。 思路 这题就是简单的 0-1 背包 DP 的小小变形而已。 我们可以定义 \(dp[i][j]\) 为前 \(i\) 个木石中剩余体力为 \(j\) 的最大填补体积。使用双重循环来递推 \(dp\)。若 \(j\ge m_i\),则 \(dp[i][j]=\max(d
阅读全文
摘要:本题做法 二分答案,贪心。 思路 我们在读入数据后首先要将任务序列按照 \(s\) 升序排序,因为我们需要优先完成时间紧迫(即完成时间靠前)的任务。随后我们可以开始进行二分答案了。令左边界 \(l=-1\),右边界 \(r=\max{s}\)。对于每一次二分出来的 \(mid\) 使用 check
阅读全文
摘要:本题做法 动态规划 DP。 思路 本题其实就是在求前序的最长递增子序列长度和后序的最长递增子序列长度在某个点 \(i\) 之和的最大值。由于本题的数据范围为 \(1\le n\le 100\),直接用 \(O(n^2)\) 的 DP 求最长递增子序列就行了。 代码 #include<bits/std
阅读全文
摘要:本题做法 数学。 思路 本题中,不难发现,一个数的各个数位之和(直到只有个位数),等于它模上 9(但是若它本身就是 9 的倍数,那么就是 9),即:记 \(S(n)\) 为各个数位之和(直到个位数),那么: \[S(n)=\begin{cases}n\bmod 9&\text{if } n\bmod
阅读全文
摘要:本题做法 队列(queue)和结构体。 思路 我们一开始最容易想到的方法就是使用一个动态数组 vector 来存储数据,但是这样操作光是一次操作 1 的 \(c\) 达到极限数据 \(10^9\) 就会直接超时,时间复杂度为 \(O(c)\)。我们需要想一些优化思路。 定义结构体类型 node 代表
阅读全文
摘要:本题做法 0/1 背包 DP。 思路 这题我们会发现,用不用药给第 \(i\) 个人,都有相应的价值,这种情况我们可以将每个人的输的情况的经验设为一个“基准数”,然后将赢的情况的经验减去输的情况的经验得到赢了之后多得到的经验。然后就可以按照正常的 0/1 背包 DP 问题去做了。 注意:最后要把输的
阅读全文
摘要:本题做法 拓扑排序。 思路 本题可以利用拓扑排序,每次找到入度为 0 的生物,然后将吃它的生物的路径计数加上它本身的计数,直到所有生物都被遍历到为止。最后输出答案即可。 代码 #include<bits/stdc++.h> typedef long long ll; typedef unsigned
阅读全文
摘要:本题做法 DFS。 思路 在主函数中枚举开始挖的地窖,然后在 DFS 途中不断更新答案及路径,最后输出即可。 代码 #include<bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const double EPS=1e-8
阅读全文