随笔分类 - C++算法
摘要:本题做法 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
阅读全文
摘要:本题做法 队列(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
阅读全文
摘要:本题做法 前缀和思想、模拟和贪心。 思路 定义一个数组 \(pre[i]\) 表示油价数组 \(a\) 中 \(a[1]\sim a[i]\) 中的最小油价,递推公式为 \(pre[i]=\min\{pre[i-1], a[i]\}(i>1),pre[1]=a[1]\)。遍历距离数组 \(v\) 的
阅读全文
摘要:题外话 本题属于赛后补题系列,以后我会陆陆续续在这个系列中更新曾经比赛中未做出来的题。 本题做法 排序,贪心,差分。 思路 这题中每一个点的覆盖方式可以看做 2 种情况: 士兵一开始就部署在这个点上,不影响体力消耗。 士兵从相邻的 2 个点之一巡逻而来,体力消耗为 2 个点距离这个点的距离。 我们要
阅读全文
摘要:本题做法 Dijkstra最短路+离散化思想。 思路 这其实是一道 Dijkstra 最短路的裸题,只需要对于每一次询问做一次 Dijkstra 然后判断输出即可。 这题有意思的点在于它的编号不是数字而是字符串,我们在这种情况下可以使用离散化思想,将每一个字符串通过 map 映射到一个唯一的数字上,
阅读全文