随笔分类 -  基础算法 - 贪心

摘要:题目大意:有 N 条鱼,每条鱼都有钓鱼和烤鱼的时间,钓鱼的时间均相同,每条鱼都有自己的烤鱼时间,一次只能烤一条鱼,且不能间断。现要求通过某种顺序将所有的鱼钓上来并烤完,求最小的时间是多少。 题解: 对于顺序可以自选的情况,可以从全局的角度进行考虑。对于最终状态,每条鱼被烤的时间和钓鱼的总次数是固定的 阅读全文
posted @ 2019-08-28 17:36 shellpicker 阅读(249) 评论(0) 推荐(0)
摘要:题目大意:给定一棵 N 个点的树,边有边权,定义“线树”为一个图,其中图的顶点是原树中的边,原树中两条有公共端点的边对应在线图中存在一条边,边权为树中两条边的边权和,求线图的最小生成树的代价是多少。 题解: 对于树中的一个顶点来说,假设有 M 条边以该顶点为一个端点,那么这 M 条边对应到线图中的顶 阅读全文
posted @ 2019-07-20 12:02 shellpicker 阅读(220) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,以及 M 个区间,现从中选出 K 个区间,使得这些区间的交集区间的点权和最大,求最大值是多少。 题解: 发现直接选 K 个区间不可做,考虑从答案入手。设答案区间为 [l,r],进行枚举答案区间的左端点。当前枚举到的左端点设为 L,那么能够以 L 作为左端点的区间 阅读全文
posted @ 2019-06-23 20:11 shellpicker 阅读(256) 评论(0) 推荐(0)
摘要:题目大意:区间最小覆盖问题。 题解:本身是一道贪心水题,但是细节还是比较多的,记录一下。 由于每个奶牛对答案的贡献是一样的,肯定要选择在满足条件的基础上能够拓展最多的那个奶牛。为了满足条件,对区间左端点进行排序,每次决策集合为:满足区间左端点比当前边界 + 1 要小的情况下,右端点最大的那个奶牛。注 阅读全文
posted @ 2019-06-11 23:56 shellpicker 阅读(301) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,每次可以合并相邻的两个元素,代价是两者中较大的值,合并之后的值也为两者较大的值,求合并 N 1 次后的最小代价是多少。 题解: 除了最大值以外,每个值均只会被合并一次,合并的代价一定是这个值左边最大值和右边最大值中较小的那一个。问题转化成了如何求解每个元素左边和 阅读全文
posted @ 2019-05-30 16:27 shellpicker 阅读(152) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,现有两个人从 P 点出发,每个单位时间每个人最多可以移动一个单位,两人之间的最大距离不能超过 M,一共有 T 单位的时间,求在合法情况下,两人可以获得的序列点权和最大是多少。 题解:模拟+贪心 首先考虑最开始的情况,在合法的情况下肯定是扩展的越大越好,在这里用了 阅读全文
posted @ 2019-05-27 09:17 shellpicker 阅读(154) 评论(0) 推荐(0)
摘要:题目大意 现在你面前有n个物品,编号分别为1,2,3,……,n。你可以在这当中任意选择任意多个物品。其中第i个物品有两个属性Wi和Ri,当你选择了第i个物品后,你就可以获得Wi的收益;但是,你选择该物品以后选择的所有物品的收益都会减少Ri。现在请你求出,该选择哪些物品,并且该以什么样的顺序选取这些物 阅读全文
posted @ 2019-05-08 23:14 shellpicker 阅读(157) 评论(0) 推荐(0)
摘要:题目大意:一共有 n 件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai t bi的美味指数,用第i件食材做饭要花去ci的时间。众所周知,gw的厨艺不怎么样,所以他需要你设计烹调方案使得美味指数最大。 题解:这道题需要对背包问题有更加深入的理解。 可以发现,如果不进行 阅读全文
posted @ 2019-05-08 23:06 shellpicker 阅读(242) 评论(0) 推荐(0)
摘要:A 直接模拟即可。 B 对数组中的值进行排序去重。发现若去重之后的数组中有大于 3 个数时无解,因为无法找到一个点到数轴上四个点的距离均相等。若去重之后的数组中只有三个值,则判断中间的值是否到两边的值相等,若不相等,同理无解,相等则解为距离。若只有两个不同的值,若中点是整数,则答案为中点到左端点的距 阅读全文
posted @ 2019-04-17 16:03 shellpicker 阅读(234) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,求序列中连续区间最大的(或和加与和)是多少。 题解: 引理:任意两个数 $i, j$,若 $i j$,则在二进制表示下,i 对应的二进制串的字典序一定大于 j 对应的二进制串的字典序。 根据引理,若当前的最优解为 X,现考虑新加入一个元素 Y,有以下三种情况。 阅读全文
posted @ 2019-04-09 19:26 shellpicker 阅读(216) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,序列中的数两两不相同,每次可以交换序列中任意两个数,代价为这两个数的和,问将序列调整为升序,最少的代价是多少。 题解:考虑这个问题的一个子问题,这个序列为 N 的一个排列的时候,代价是多少。首先,对于许多交换操作来说,并不是所有操作都是有意义的。可以发现,序列可 阅读全文
posted @ 2019-04-08 00:49 shellpicker 阅读(260) 评论(0) 推荐(0)
摘要:题目大意:有 N 种长度的边,第 i 种长度为 $2^i$,给定一些数量的这些边,问最多可以组合出多少种三角形。 题解:应该是用贪心求解,不过选择什么样的贪心策略很关键。 首先分析可知,两个较大边和一个较小边可以组合出三角形,但是反过来不行。从后往前考虑,记录到目前为止有多少对边,若当前边为奇数,考 阅读全文
posted @ 2019-04-07 00:58 shellpicker 阅读(216) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,有 M 个询问,每个询问要求输出长度为 L 的上升子序列,若不存在,输出 impossible,若存在,输出下标字典序最小的一个。 题解:考虑到若 L 大于整个序列的 LIS 的长度,显然无解。反之,则一定有解。输出下标字典序最小,考虑按照下标贪心即可。 代码如 阅读全文
posted @ 2019-04-03 16:47 shellpicker 阅读(159) 评论(0) 推荐(0)
摘要:题解:发现可以通过枚举区间将区间和相同的元组记录在一个表中,对于答案来说,在同一个表中的元组的选择才会对答案产生贡献。发现每一个表中都是一个个区间,问题转化成了对于每一个表来说,选择若干个不相交的区间,使得选择出来的区间数量最多,直接贪心即可。 代码如下 cpp include using name 阅读全文
posted @ 2019-03-20 22:06 shellpicker 阅读(323) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个操作,每个操作为按位与、或、异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大。 题解:位运算有一个重要的性质是:位运算时,无进位产生,每一位之间相互独立。因此,可以从高到低依次考虑每一位对答案的贡献值,计算每一位经过这 N 个操作后 阅读全文
posted @ 2019-01-13 15:15 shellpicker 阅读(165) 评论(0) 推荐(0)
摘要:题目大意:需要维护一种数据结构,支持以下三种操作:插入一个数,删除一个数,查询该数据结构中的数异或给定数的最大值。 题解:如果没有删除操作就是一个标准的 Trie 上贪心求最大异或和问题。现在需要支持删除操作,因此,在树上每个节点维护一个额外的标记,表示 有多少个数的某一位经过当前节点 。插入操作依 阅读全文
posted @ 2018-12-18 23:24 shellpicker 阅读(186) 评论(0) 推荐(0)
摘要:题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少。 引理:K 叉哈夫曼树需要保证 $(n 1)\%(k 1)=0$,在此基础上,每次取 K 个合并即可得到最小代价。 代码如下 cpp includ 阅读全文
posted @ 2018-12-06 16:55 shellpicker 阅读(237) 评论(0) 推荐(0)
摘要:题目大意:给定一个有 N 个点,M 条边的无向图,点有点权,删除一个点就要付出所有与之有联系且没有被删除的点的点权之和的代价,求将所有点删除的最小代价是多少。 题解: 从图连通性的角度出发,删除所有点就意味着需要删除所有的边。 现在来考虑每条边对答案的贡献,由于所有边均需要被删除,才能使得原图完全不 阅读全文
posted @ 2018-11-30 21:02 shellpicker 阅读(218) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个位置,每个位置有一个答案贡献值,在一个位置加了一次该位置的答案贡献值之后,该值会减掉一部分,从一个位置移动到另一个位置需要花费一定的时间,问:给定 M 单位的时间,如何移动使得答案贡献值最大。(初始在1位置) 题解: 引理:若想使答案贡献值最大,一定不能走回头路,因为走回头路时 阅读全文
posted @ 2018-11-24 16:24 shellpicker 阅读(178) 评论(0) 推荐(0)
摘要:题目大意:给定 N 项任务,每项任务有一个截至完成时间,若在截止时间之后完成要罚款 $w_i$ 元,最初有 M 元,怎样完成能够留下最多得钱。 题解:按照罚款从多到少贪心,在查找能够最晚完成一项任务的时间时,可以采用并查集优化,即:建立一个时间上的并查集,每次在某个时间完成一项任务时,合并当前时间和 阅读全文
posted @ 2018-11-24 15:29 shellpicker 阅读(596) 评论(0) 推荐(0)