![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 74
数据结构
happy19991001
笨鸟先飞
展开
-
尺取法:有效三角形的个数
尺取法:有效三角形的个数原创 2022-06-25 15:50:43 · 424 阅读 · 1 评论 -
折半搜索(中途相遇法) + 暴力枚举:PIPI的炼金术
折半搜索(中途相遇法) + 暴力枚举:PIPI的炼金术文章目录折半搜索(中途相遇法) + 暴力枚举:PIPI的炼金术问题:思路:代码:问题:思路: 首先我们要把问题进行一个转化。根据题意,我们把若干材料炼金成功,只需这些材料字符串各个字符出现个数之和为偶数就行,而材料字符串全都是由小写字母组成,小写字母a-z可以对应数字0-25。因此我们可以考虑如下操作:我们将每个字符串中字符的出现次数是偶数还是奇数记录下来,用二维数组alphabet保存,alphabet[i][j]=0表示第i个字符串的字原创 2022-03-13 11:57:40 · 496 阅读 · 0 评论 -
差分数组 + 二分查找:PIPI种庄稼
差分数组 + 二分查找:PIPI种庄稼文章目录差分数组 + 二分查找:PIPI种庄稼问题:思路:代码:问题:思路: 首先我们按高度对庄稼进行排序。接下来,我们设lIndex为第一个大于前一天晚上水位b的庄稼的下标,rIndex为第一个大于当天白天水位a的庄稼的下标,那么在[lIndex,rIndex - 1]区间范围内的庄稼就被淹了一次。在这m天里,我们每天可以使用二分查找来快速求出lIndex与rIndex 如果我们用一个数组A来记录每个庄稼被淹了多少次,一开始A中所有值均为0,lInd原创 2022-03-11 16:12:17 · 1131 阅读 · 0 评论 -
差分数组:PIPI的区间操作Ⅰ
差分数组:PIPI的区间操作Ⅰ文章目录差分数组:PIPI的区间操作Ⅰ差分数组问题:思路:代码:差分数组 差分数组其实就是对数组做差分,即前一项减去后一项,差分数组的定义为:对于有n个元素的数组a,差分数组b为数组a中每一项与前一项的差值。显然,b[1]=a[1]-0=a[1];对于整数i∈[2,n],则有b[i]=a[i]-a[i-1]。例子如下: 我们不难发现,设sum数组为b数组的前缀和数组,那么sum数组的值和a数组的值是对应相等的,也就是说,相对于数组a的差分数组b来说,a数组就是其前原创 2022-03-10 11:33:40 · 360 阅读 · 0 评论 -
矩阵快速幂:PIPI的数学题IV
矩阵快速幂:PIPI的数学题IV文章目录矩阵快速幂:PIPI的数学题IV问题:思路:代码:问题:思路: 求斐波拉契数列实际上是一个DP问题,DP的状态转移方程已经给出了,问题在于用给出的状态转移方程进行线性递推,时间复杂度是O(n)的。然而本题的n达到了1e10的规模,肯定会超时,那么有什么办法能优化呢?答案是矩阵快速幂。 快速幂是什么这里就不多说了,给个传送门:数学专题:同余定理、gcd与lcm、中位数定理、筛法、快速幂等 那么什么是矩阵快速幂?矩阵快速幂其实就是将DP的状态转移方程原创 2022-03-10 10:33:31 · 246 阅读 · 0 评论 -
数据结构与算法:位运算专题
数据结构与算法:位运算专题文章目录数据结构与算法:位运算专题位运算基础位运算例题例题1:PIPI的位运算问题Ⅳ问题解题思路代码位运算基础 位运算指的是直接对二进制位进行的一系列操作。常用的位运算有以下几种:AND(按位与):运算符为&,作用是把两个数字对应的二进制位相与,只有对应的两个位为1,结果位才为1,否则结果位为0。比如:13&12=1101&1100=1100=12。OR(按位或):运算符为|,作用是把两个数字对应的二进制位相或,只有对应的两个位为0,结果位才为原创 2022-03-07 11:35:22 · 563 阅读 · 0 评论 -
尺取法:PIPI的目标Ⅲ
尺取法:PIPI的目标Ⅲ文章目录尺取法:PIPI的目标Ⅲ问题:思路:代码:问题:思路: 首先对数组R进行排序,如果直接枚举a,b,c的话,时间复杂度为O(n^3),肯定会超时,那么我们接下来考虑使用尺取法来解决此题。 我们只枚举a,然后令b=a+1,即b为a的下一位,c=n。枚举过程如下: 如果此时R[a]+R[b]+R[c]==0,那么满足要求,我们输出结果,然后令b++,c- -,之后继续进行和的判断。 如果此时R[a]+R[b]+R[c]<0,那么显然我们的值小了。由于原创 2022-03-01 12:05:18 · 301 阅读 · 0 评论 -
DP(三维DP数组) :买卖stock的best timing
DP(三维DP数组) + 暴力枚举:买卖stock的最佳时机文章目录DP(三维DP数组) + 暴力枚举:买卖stock的最佳时机问题思路代码问题思路 题目中首先出现了两个影响利润的因素:天数(第几天)、最多允许的交易次数,我们的DP数组需要包含这两维,但仅仅有这两维我们还是无法进行状态转移,因为我们不知道某一天到底有没有买卖股票。我们需要发现判断某一天i是否买卖股票的关键在于判断第i天与之前第i - 1天的持股状态,若第i - 1天未持股,第i天持股,则第i天买了股票,否则没买;若第i - 1原创 2021-12-12 17:37:40 · 1158 阅读 · 0 评论 -
博弈DP:PIPI的炸弹
博弈DP:PIPI的炸弹文章目录博弈DP:PIPI的炸弹问题思路代码问题思路 本题是一道博弈类的动态规划问题,一般而言这类问题为如下形式:博弈为两方游戏,一方按照规则先行动,行动完后把当前局面交给对方,对方再按照规则继续行动,行动完后把局面又重新交回来。以此类推,双方轮流行动,直到满足一定条件,则某方胜或者负。 这类问题关键在于先手的转换,比如对于当前先手的人来说,他进行操作后,把某个局面交给对方。那么对方就以先手的情况来面对一个新的局面。因此DP数组需要去保存某个局面下会导致当前先手胜还原创 2021-12-11 15:43:40 · 574 阅读 · 0 评论 -
区间DP + 暴力枚举 + 前缀和:堆石子
区间DP + 暴力枚举 + 前缀和:堆石子文章目录区间DP + 暴力枚举 + 前缀和:堆石子问题思路代码问题思路 首先要注意每次只能合并相邻的石子,没有相邻这个限制就是一个简单的Huffman树贪心问题,有相邻的条件限制就变成了一个经典的区间DP问题 我们将石子的排列看作一个区间,题目要我们求合并n个石子的最小费用,可以看成是求合并区间[1,n]内石子所需最小花费。我们可以定义状态DP[l][r]表示合并区间[l,r]上的石堆的最小花费。而DP[l][r]是如何经状态转移得到的呢?注意到我原创 2021-12-10 12:00:19 · 651 阅读 · 0 评论 -
DP + 记忆化搜索 + 字符串HASH:回文串询问Ⅱ
DP + 记忆化搜索 + 字符串HASH:回文串询问Ⅱ文章目录DP + 记忆化搜索 + 字符串HASH:回文串询问Ⅱ记忆化搜索问题思路代码记忆化搜索 我们知道DP状态求解的常用写法是定义一个DP数组,然后通过状态转移方程填充这个DP数组,得到所有状态。而记忆化搜索是DP状态求解的另一种写法,原理也是把计算过的状态用一个dp数组保存,下次就可以直接调用。它是一种自顶向下的写法,从最终状态出发,去计算最终状态依赖的状态,然后以同样的方式计算最终状态依赖的状态依赖的状态(这里并没有多打一遍)。实际上就是一原创 2021-12-09 12:05:23 · 541 阅读 · 0 评论 -
DP:地头蛇PIPI
DP:地头蛇PIPI文章目录DP:地头蛇PIPI问题思路代码问题思路 我们首先有一个自然而然的想法,我们设DP[i]为1~i这些商家能收取的最大保护费。但这样设状态我们不知道最后收取了到底是哪一家的保护费,不好进行状态的转移。因此,我们把DP[i]设为:一定收取了第i个商家保护费的情况下,1 ~ i这些商家能收取的最大保护费。收取了第i个商家的保护费,那么第i-1个商家的保护费就不能收取了,那么DP[i]看起来是从DP[i-2],DP[i-3],…,DP[1]这里面转移过来,但实际上DP[i]原创 2021-12-08 11:38:58 · 345 阅读 · 0 评论 -
DP:最长公共子序列Ⅰ
DP:最长公共子序列Ⅰ文章目录DP:最长公共子序列Ⅰ问题思路代码问题思路 我们先从最简单的情况入手,设两个字符串为A,B,如果只看两个串的前1个字符,那么如果A[1]等于B[1],最长公共子序列为1;如果A[1]不等于B[1],最长公共子序列为0。如果只看前2个字符,如果A[2]等于B[2],最长公共子序列长度是否等于之前只看前1个字符时的答案+1呢?一个公共子序列一定包含在从第一个字符开始的某个连续序列中,而不同连续序列以不同位置的字符结尾,如果用DP[i]表示两个串前i个字符以第i个字符结原创 2021-12-08 11:07:49 · 258 阅读 · 0 评论 -
DP or 贪心 + 二分答案:最长上升子序列Ⅰ
DP or 贪心 + 二分答案:最长上升子序列Ⅰ原创 2021-12-06 12:01:49 · 258 阅读 · 3 评论 -
DP + 完全背包问题:PIPI的存钱罐
DP + 完全背包问题:PIPI的存钱罐文章目录DP + 完全背包问题:PIPI的存钱罐完全背包问题问题思路代码完全背包问题 之前我们讲了01背包问题:DP + 01背包问题:饭卡。现在我们来看看完全背包问题,完全背包问题与01背包问题唯一的区别就是:01背包问题中的每个物品都只有一个,只能装一次,而完全背包问题中的每件物品都有无数个,可以装任意次。 我们还是给出完全背包问题的描述:给定 n 种物品和一个空间为 C 的背包,第i种物品的体积是vi,其价值为wi ,每种物品有无数个。应该如何选择装原创 2021-12-06 10:39:13 · 568 阅读 · 1 评论 -
DP + 01背包问题:饭卡
DP + 01背包问题:饭卡文章目录DP + 01背包问题:饭卡01背包问题问题思路代码01背包问题 01背包问题是指:给定 n 件物品和一个空间为 C 的背包,第i件物品的体积是vi,其价值为wi 。应该如何选择装入背包的物品,在不超过背包容量的前提下,使装入背包中的物品总价值最大?注意每个物品都只有一个,即每个物品都只有装与不装两种情况。 对于01背包问题,首先我们肯定可以使用DFS的方法解决,枚举每个物品装还是不装,使用一个变量ans来保存每种不超过背包体积的方法中,价值最大的那个,那么时原创 2021-12-04 21:00:13 · 563 阅读 · 0 评论 -
简单字符串处理:Leetcode 599:两个列表的最小索引总和
Leetcode 599:两个列表的最小索引总和问题:思路:使用STL中的无序关联容器unordered_map,键为字符串,对应的值为索引。将list1中的数据加入容器中,设索引和最小值的初始值为10000,对于list2中的字符串,查找容器中是否有键值相等的元素(相等的字符串),若有,计算索引和,若小于当前最小值,将最小值更新,并将已保存的全部字符串清除(找到了更好的最小索引)。若索引和与当前最小值相同,则将当前字符串保存。代码:class Solution {public: v原创 2020-05-11 16:35:26 · 165 阅读 · 0 评论 -
数学:Leetcode447:回旋镖的数量
Leetcode447:回旋镖的数量问题:思路:用哈希表记录每个点到其他点的线段长度使用unordered_map,键代表线段长度,值代表该线段长度出现的次数对于每个点,若相同的线段长度出现了2次及以上,则存在回旋镖。设相同的线段长度出现次数为n,从n=1开始,每次新增一次出现次数,回旋镖的数量增加2*(n-1),以下为证明:当n增加1时,新增的回旋镖为:在(n-1)个点中选一个,与新增的点组合,由于这两个点在元组中的位置可以互换,新增的回旋镖总数即为 2*(n-1)代码:class S原创 2020-05-14 10:37:44 · 216 阅读 · 0 评论 -
字典树:Leetcode 720:词典中最长的单词
Leetcode 720:词典中最长的单词问题:思路:1.排序+哈希表考虑将排序后的字符串散列到unordered_set中对于排序后的输入,依次寻找字符串的子串是否在unordered_set中,首先子串中只包含第一个字符,随后子串增加第二个字符,以此类推,直至子串包含倒数第二个字符。若这些子串全都存在,则该字符串由词典中的单词组成,若此时该字符串长度也为满足条件的单词中最大的,则可以输出答案了,因此在排序中字符串长度长的应排在前面由于题中要找出最长的单词,应改变排序策略,若两字符串长度相原创 2020-05-13 22:07:20 · 292 阅读 · 0 评论 -
暴力模拟题:分数
暴力模拟题:分数题目:思路:应在long long表示的数据范围内解决问题,因此不应以除法进行权重计算,将计算权重的公式进行转换,左右两侧同时乘以每轮最大分数的乘积,将除法转换为乘法由于-1可为0~C中的任意数,每个值都对应一种不同的情况,遍历所有情况,用c1,c2记录每个参赛者出现一定晋级、一定淘汰的次数在遍历-1取值的过程中,计算每个参赛者的总得分,设为t,创建总得分的副本为s,对总得分的副本按降序排序,若t[i]>=s[k-1],则i一定晋级,c1[i]++;若t[i]<=s原创 2020-05-16 09:52:45 · 219 阅读 · 0 评论 -
简单二分查找:搜索旋转排序数组
搜索旋转排序数组问题:思路:二分查找( 时间:O(log n)) 二分查找只能用于有序序列,旋转后的序列不是有序序列,但是用二分查找中的mid将数组一分为二后,总有一半的数组是有序的 (可用反证法证明)。可以在这部分有序数组中使用二分查找代码:class Solution {public: int search(vector<int>& nums, int target) { int n=nums.size(); if( n==0原创 2021-03-16 10:48:28 · 116 阅读 · 0 评论 -
简单模拟:Laptop
简单排序题:Laptop问题:思路:建立结构体数组,成员为laptop的内存和速度先对内存按降序排列,初始设ymax为排序后数组第一个元素的速度,从第二个元素开始遍历数组,若当前遍历元素的速度比ymax小,则该元素被“完虐”,计数加一若当前遍历元素的速度比ymax大,则更新ymax(以后遍历的元素速度若小于新的ymax则被“完虐”)代码:#include<algorithm>#include<iostream>using namespace std;struc原创 2020-05-14 16:24:44 · 268 阅读 · 0 评论 -
单调栈:最短无序连续子数组
最短无序连续子数组问题:1.排序法( O(nlogn))思路:建立一个新数组,其元素为原数组的升序排列,比较两数组,得到第一个和最后一个不匹配的元素,它们都需重新排列,且是子数组的边界代码:class Solution {public: int findUnsortedSubarray(vector<int>& nums) { int n...原创 2020-04-28 15:25:35 · 302 阅读 · 0 评论 -
数学:数组之卡牌分组
数组之卡牌分组问题:思路:计算出数组中每个元素出现的次数,若要能完成题目中的分组要求,则它们的最大公约数至少为2使用一个数组统计元素出现的次数,此数组的下标即为原数组中元素的值对新创建的数组的非0元素进行遍历,使用gcd函数计算最大公约数,设由上一非0元素得到的最大公约数为g,g的初值为0( 因此第一个非0元素计算得到的最大公约数即为其自身 ),下一非0元素与g求最大公约数,依次类推...原创 2020-04-28 21:48:21 · 277 阅读 · 0 评论 -
暴力:数组之图片平滑器
数组之图片平滑器问题:思路:蛮力法:需遍历二维数组中的所有元素,先确定边界。当 当前遍历元素所在行的上一行和下一行存在时,需遍历3行元素;当 当前遍历元素所在列的左列和右列存在时,需遍历3列元素;设当前遍历元素所在位置为i行j列,整个矩阵为m行n列当上一行不存在时,i-1<0,此时当前行为第0行,行遍历的范围从0行开始当下一行不存在时,i+1>=m,i>=m-...原创 2020-04-27 15:19:47 · 209 阅读 · 0 评论 -
减治:主元素问题的最优解
主元素问题的最优解主元素问题:设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。给出一个算法,判断A中是否存在主元素并输出最优解思路:利用了减治的思想,移出两个不同的数字,剩下数字构成的集合主元素不改变主元素出现的次数>n/2 ,若两个不同的元素两两相抵消,最后若数组元素完全抵消,则不存在主元素,若没有完全抵消,则余下的元素可能为主元素(是否为主元素还需要进行检验,如(0,1,2)虽然剩下2,但并不存在主元素)首先设C=A[0],计数值count=1,从原创 2020-06-02 21:07:44 · 1126 阅读 · 0 评论 -
暴力:another server
暴力与枚举:another server题目描述:何老师某天在机房里搞事情的时候,发现机房里有n台服务器,从1到n标号,同时有2n-2条网线,从1到2n-2标号,其中第i条网线双向连接着服务器和号服务器,在一个单位时间内最多能够承受x_i个单位流量。 显然这些服务器之间要进行信息交换,为了测试服务器的抗压能力,你需要帮何老师计算出1号服务器在一个单位时间内最多能向n号服务器发送多少个单位...原创 2020-03-29 20:50:35 · 335 阅读 · 0 评论 -
暴力:竖式问题
竖式问题问题:思路:暴力枚举(将构造性问题转化为验证性问题) 我们可以遍历数字集合,去选取满足条件的竖式,但这种方法十分麻烦,因为我们需要找出5个数字,将会有5个for循环,所以这种方法肯定是不可取的 我们可以换一种思路,既然从数字集合中构造竖式十分困难,但是三位数总共就是100~999,两位数总共是10 ~ 99,我们可以遍历所有的三位数和两位数,再去验证它们是否满足条件,这样我们就将构造性问题转换为了验证性问题。 我们用一个标记数组记录数字集合中出现的数字,数组大小可设为11,因为总原创 2021-03-20 09:47:56 · 159 阅读 · 0 评论 -
贪心:贪心法之主持人的烦恼
贪心法之主持人的烦恼问题:思路:若要达到组数最大,则对每个元素,应选择最有可能与其组成一组的元素与其组合。对输入排序,从数组的第一个元素起,最有可能与其组成一组的元素即为其后继元素(因为其后继元素的值与其的差值是所有选择中最小的),选择满足约束的后继元素与其组成一组为当前步骤中所有可行选择中最佳的局部选择。若其后继元素满足条件,计数器加1,指针加2,若其后继元素与其的差>=m,则在...原创 2020-04-08 17:45:36 · 223 阅读 · 0 评论 -
模拟:相交链表
相交链表问题:思路:将长链表移动使两个链表的剩余长度相同,对两链表中剩余的每个对应结点判断结点是否相同代码:struct ListNode { int val; struct ListNode *next;};struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)...原创 2020-04-18 11:23:07 · 115 阅读 · 0 评论 -
DP:动态规划之一起来数二叉树
动态规划之一起来数二叉树题目:思路:DP的核心是求出递推方程可用二维数组保存计算结果对于含i个节点,j个叶子节点的二叉树(j<=i),设总形态数为a[i][j]将含i个节点,j个叶子节点的二叉树分为两部分,一部分为左子树,另一部分为右子树设右子树包含x个节点,y个叶子节点;则左子树包含i-x-1个节点,j-y个叶子节点;0<=x<=i-1,0<=y<...原创 2020-04-06 15:31:52 · 192 阅读 · 0 评论 -
DP题:分隔数组以得到最大和
DP题:分隔数组以得到最大和问题:思路:dp[i] 表示划分了前 i 个数字产生的最大和。这里的 i 下标从 1 开始。转移时,考虑第 i 个数字与之前多少个数字组成一个子数组。故枚举 j 从 1 到 K,取 dp(i−j)+max∗j 的最大值。这里的 max 为区间的最大值,可以在枚举转移的时候更新。递推方程:代码:class Solution {public: int maxSumAfterPartitioning(vector<int>& A, in原创 2020-05-28 11:27:05 · 190 阅读 · 1 评论 -
DP:最长有效括号
最长有效括号问题:思路1:DP( 时间:O(n);空间:O(n )) 设DP[i]表示以下标i的半括号结尾的最长有效括号长度。设s为字符串,s[i]只能为)才能结尾,否则DP[i]=0。 当s[i]=)且s[i-1]=(时,dp[i]=dp[i-2]+2。 当s[i]=)且s[i-1]=)时,则在前面必有一个(与s[i]对应,它的位置在s[ i-1-DP[i-1] ]。因此当s[i]=)且s[i-1]=)且s[ i-1-DP[i-1] ]=(时: DP[i]=DP[i-1]+2+DP原创 2021-03-15 16:53:36 · 187 阅读 · 0 评论 -
DFS + 回溯法:N皇后问题
N皇后问题问题:思路:DFS+回溯 DFS+回溯法解题是一种思想,不是说这道题目是图的题,非图的题可以使用这种思想解决 我们可以建立一个dfs函数逐行遍历所有情况,dfs函数的参数有我们需要return的ans,当前行数row,N 我们需要知道哪些点是被禁用的,因此我们需要创建标记数组。对于我们放皇后的点,与它同行、同列、以及在它所在的主对角线和副对角线上的点全部被禁用,由于我们是逐行遍历,因此不需要建立行的标记数组,因此我们需建立列标记数组、主对角线标记数组、副对角线标记数组 列标原创 2021-03-20 14:35:08 · 153 阅读 · 0 评论 -
贪心 :PIPI渡江
贪心 :PIPI渡江文章目录贪心 :PIPI渡江问题:思路:代码:问题:思路: 我们可以在读取数据时就进行处理,设用ans表示可以渡江的分身数,对于x >= d的分身,第一次跳跃就可以渡江,ans++;对于x < d && x + y >= d的分身,第一次跳跃虽不能渡江,但可以踩别人渡江,我们称这些分身为被选中的分身;对于x < d && x + y < d的分身,它们是不可能渡江的,只能当垫脚石被别人踩,将其称为垫脚石分身。原创 2021-11-28 17:17:49 · 244 阅读 · 0 评论 -
反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ
反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ文章目录反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ问题:思路:代码:问题:思路: 最直接但错误的想法是:我们每回合开始时都可以尝试去进行攻击,这样能尽快杀死popo,如果接下来承受不住popo的进攻,我们或许可以放弃该回合的进攻,转为防守,即进行回血操作(设已经承受了popo造成的伤害attack,若奶量大于伤害,则回B点血,否则进行护卫,回attack点血)。但这种策略并不是贪心的策略,因为在不同的回合进行防守,赚的回血量不同,比如在popo的攻原创 2021-11-27 15:51:57 · 843 阅读 · 0 评论 -
贪心 + 优先队列:程序员PIPI
贪心 + 优先队列:程序员PIPI文章目录贪心 + 优先队列:程序员PIPI问题:思路:代码:问题:思路: 本题实际上是要我们在坐标轴上找到区间重叠最多的那一段有多少个区间。 我们可以将进程按开始时间从小到大排序,我们的贪心策略是让一个计算机处理尽可能多的进程,为了达到这一目的,我们要让每个计算机的空闲时间尽可能少,即完成一个进程后尽快处理下一个进程,因此我们需要知道正在处理进程的所有计算机中,最早完成任务的计算机的完成时间,即正在被处理的进程的最早结束时间。若当前需要被处理的进程的开始时原创 2021-11-26 11:44:51 · 3352 阅读 · 0 评论 -
贪心:最大容量和
贪心:最大容量和文章目录贪心:最大容量和问题:思路:代码:问题:思路: 首先我们需要知道,每个桶的容量就是组成它的最短木板的长度,要让总容量最大,那么我们所选取的每个桶的最短木板的长度也要尽可能大,于是我们的贪心策略为:尽可能让长木板作为最短木板 我们将木板按长度从小到大排序,用wood[]数组表示。每个木板都是需要用上的,最短的那根木板也需要用上,设其长度为wood[0],而任意桶间的容量差要大于等于L,那么我们能选择的组成桶的最短木板的最大长度为wood[0] + L。我们遍历wood原创 2021-11-26 10:43:10 · 258 阅读 · 0 评论 -
贪心 + 背包问题:可乐
贪心 + 背包问题:可乐文章目录贪心 + 背包问题:可乐问题:思路:代码:问题:思路: L为我们需要购买的可乐的总体积,我们每进行一次可乐购买,所需要的可乐体积便会减少,设need为我们还需要购买的可乐体积。假设当前性价比最高(即每升单价最低)的饮料为 V 升每瓶, 价格为C。那么我们在不超过need的情况下优先买性价比最高的饮料肯定是最优选择。 故我们优先买need/V瓶该饮料,若此时need%V为0,那么我们刚好买够need升,没有浪费钱也没多买饮料;若此时need%V不等于0 , 那原创 2021-11-25 15:24:57 · 402 阅读 · 0 评论 -
区间贪心:最小区间覆盖问题、PIPI的高速公路
区间贪心:最小区间覆盖问题文章目录区间贪心:最小区间覆盖问题问题:思路:代码:问题:思路: 本题是区间贪心的一种:在满足覆盖[L,R]区间的情况下,最少能选择多少个区间 我们可以将线段(区间)按左端点从小到大排序,我们的贪心策略是每次所选择的区间使后面预留的空间最小,即尽可能多地占用[L,R]中的空间。为此,我们可以定义右极限rLimit,表示当前所遍历到的合法区间中r的最大值,初始化为L,每次我们从合法的备选区间(即l <= rLimit)中找出右端点r最大的区间并选择该区间,接着原创 2021-11-24 10:29:12 · 623 阅读 · 0 评论