随笔分类 - 算法 - 贪心
摘要:手画一下发现最优策略是统一向左/向右移,那我们就让鞋子向左移. 因为一个鞋子向左移不会使右面的答案变差,而最左面没有被匹配的鞋子也迟早要和一个鞋子去匹配. 写了一个 $O(n^2)$ 的暴力,过掉了 50pts. 然后我们发现将鞋子从 $j$ 移到 $i$ 的代价是 $j-i-$ $[i,j]$ 中
阅读全文
摘要:刚开始想的贪心是先删掉儿子数量多的. 但是如果一棵树有一条特别长的链的话这个贪心就假了. 换一种贪心思路:优先删掉子树深度大的. 这种贪心题的证明也不会了,感觉没啥反例就当正确了. 以后做贪心题的时候还是要多手造几组数据,验证正确性. 希望正式考试能少出这种贪心(出的话大样例一定要足够强) code
阅读全文
摘要:二分最大值,然后考虑如何处理. 正着做很难,因为每次减掉 $p$ 后还要与 0 取 max,但是倒着做就会容易很多. 先将所有数的高度都置为 $mid$,那么就有两种操作: 1. -a[i] 2. +p 显然每次减掉 $a[i]$ 后不可以小于 0,因为如果减掉 $a[i]$ 后小于 0 的话意味着
阅读全文
摘要:比较好的一道贪心题. 有 3 种操作: 1. 对一个位置赋值. 2. 对一个位置进行加法. 3. 对一个位置进行乘法. 显然,如果想让结果最大,顺序一定是 1,2,3 即先赋值再加最后乘. 3 种情况同时存在不好比较,那么考虑将所有操作都转换成乘法. 假设一个操作加了 $x$,另一个操作乘了 $y$
阅读全文
摘要:脑残了,这题竟然都不会. 显然,把所有左右端点放在一起排序,然后取中位数是 $k=1$ 时最优的. $k=2$ 的时候显然距离中点越近越好,所以将中点扔进去,然后枚举中间的分割点,分割点左右就变成两个子问题了. 动态求中位数的话用平衡树/权值线段树维护就行了. code: #include <bit
阅读全文
摘要:我不明白这道题第二问到底在说啥...... 第一问比较简单,直接用 set 来贪心就行了. 然后我感觉第二问就是求一个最大独立集就行. 套路:都 0202 年了,看到最优化就要上随机化呀!! code: #include <bits/stdc++.h> #define N 10008 #define
阅读全文
摘要:有一个显然错误的做法:依次试着将点加入团内. 但是我们可以随机这个加入顺序,成功率就大大提高了. code: #include <bits/stdc++.h> #define N 506 #define ll long long #define setIO(s) freopen(s".in","r"
阅读全文
摘要:这道题太 tm 卡内存了. 不知道这样做意义何在,是在考察选手卡常能力吗 ? 思路没啥说的,整个棋盘的形态我们是知道的. 那么显然从小到大把数往棋盘里填,然后我们每次不可以选的是一个左下角和右上角区域,暴力覆盖就行. 覆盖的时候要判一下什么时候 break,来保证每个地方只被覆盖依次. code:
阅读全文
摘要:当相邻字母不相同的时候做法显然,相同的时候将相同区间提取出来,然后按照不同做就行. code: #include <bits/stdc++.h> #define ll long long #define N 1000006 #define setIO(s) freopen(s".in","r",st
阅读全文
摘要:显然,我们可以将每个东西的 $a,b$ 属性转换成二维坐标系中的点. 那么我们每次查询的时候查的是一个右下角矩阵. 没有被套的数量等于矩阵内总数量减去矩阵内可以套其他物品的数量. 我们考虑按照 $a$ 从大到小依次处理. 那么对于 $(x,y)$ 来说,显然匹配一个 $(x',y')$ 满足 $y'
阅读全文
摘要:显然,如果不出现重复数字的话直接贪心填就是正确的. 然而,当出现重复数字时这个贪心就错了. 将这个问题抽象成树是显然的. 我们先将所有数从大到小排. 对于大小为 $size[i]$ 的 $i$ 来说,肯定选当前能选的第 $size[i]$ 大的. (设为 $x$) 那么,选择完 $x$ 后,显然 $
阅读全文
摘要:如果 $k$ 值确定的话,我们直接来一个 $O(n)$ 的贪心就行. 那么我们就将 $k$ 分为大于 $B$ 和小于 $B$ 两部分处理. 对于小于 $B$ 的部分,暴力处理,复杂度为 $O(nB)$. 对于大于 $B$ 的部分,取值分别为 $[0,\frac{n}{B}]$ 且依次递减. 那么我们
阅读全文
摘要:按照挂件数量排序,然后做一个 DP 就好了. code: #include <bits/stdc++.h> #define ll long long #define N 2003 #define setIO(s) freopen(s".in","r",stdin) using namespace s
阅读全文
摘要:思路很巧妙啊 code: #include <cstdio> #include <cstring> #include <algorithm> #define ll long long #define N 1000009 #define setIO(s) freopen(s".in","r",stdi
阅读全文
摘要:这个还是非常神仙的... code: #include <cstdio> #include <algorithm> #define N 1006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespa
阅读全文
摘要:貌似是套路题. 假设给定我们一些区间,那么这些区间交集的左端点是左端点最靠右区间的左端点. 所以我们将所有区间按照左端点从小到大排序,然后用堆维护前 k 大的右端点. 那么,对于枚举到的第 $i$ 个区间来说,右端点就是第 $k$ 大的右端点与当前区间右端点的较小值. code: #include
阅读全文
摘要:code: #include <cstdio> #include <cstring> #include <algorithm> #define N 100020 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using
阅读全文
摘要:比较神奇的贪心 有点类似于田忌赛马. 如果我方最弱强于对面最弱,则直接最弱pk最弱. 如果我方最强强于对面最强,那么直接最强间pk. 否则,试着用我方最弱 pk 对方最强,看是否能打成平手. code: #include <bits/stdc++.h> #define N 100006 #defin
阅读全文
摘要:和超级钢琴,异或之三倍经验 $?$ 堆+贪心素质三连 $?$ 好无聊...... code: #include <bits/stdc++.h> #define N 500006 #define ll long long #define setIO(s) freopen(s".in","r",stdi
阅读全文
摘要:和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w"
阅读全文

浙公网安备 33010602011771号