
贪心
Lynstery
一只蒟蒻
展开
-
[贪心+堆] BZOJ1150: [CTSC2007]数据备份Backup
题意直线上有n个点,选K对点之间连线,一个点只能连出去一条线,求连线的总长度的最小值。 n<=1000000,k<=n/2题解贪心真可怕…… 显然要连肯定是连相邻的。我们把n-1个相邻差值拿出来,问题转换为n-1个数中取K个不相邻的数的和的最小值。 n比较大,考虑贪心: 如果我取了最小的数会怎么样呢?显然是不对的: 例如:2 1 2 100, 取2个 如果第一次取了 11,之后只能取 1原创 2017-07-23 10:52:33 · 736 阅读 · 2 评论 -
[贪心] Codeforces #545D. Queue
大胆猜想一下,就过了…怎么说服自己呢? - 对于些固定必选的人,从小到大排最优。 - 最后的序列里肯定只保留对答案有贡献的人,其他的随便堆在后面就好了。 - 两人都有贡献的情况下,小的更有价值。 ……具体见代码#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;typede原创 2017-11-03 16:37:37 · 360 阅读 · 0 评论 -
[贪心 + DP] Codeforces #571B. Minimization
不错的题。 容易想到按模 KK 分类 。每类的贡献时独立的,就是∑i|xi−xi+1|\sum_{i} |x_i-x_{i+1}| 这样的形式。如果我们已经确定了每类是哪些数,那么同类中排个序是最优的。 如何分配数分在哪一类呢 ? 发现我们一定是把连续的数放在一起比较优。 这样贪心的分析一下就变的很简单了,直接把 aa 数组排序。然后就是要把a分成 KK 段,每段的代价是末尾的值减去开头的值。原创 2017-10-25 14:46:20 · 319 阅读 · 0 评论 -
[杂题 贪心] BZOJ4723: [POI2017]Flappy Bird
本来想倒着搞得到每个点的柱子能飞的区间,但是发现飞的位置和横坐标奇偶性有关,不太对。 其实正着搞就好了,每次得到的区间,由于奇偶的原因需要微调。#include<cstdio>#include<algorithm>using namespace std;const int maxn=500005;int n,x[maxn],a[maxn],b[maxn],now_L,now_R;int原创 2017-10-29 20:43:47 · 428 阅读 · 0 评论 -
[扫描线 + 线段树] 51Nod1672 区间交
这题数列都是非负的,所以就比较简单了。 可以扫描线,枚举左端点,然后考虑覆盖了左端点的区间,挑右端点第 KK 大就好了。#include<cstdio>#include<vector>#include<algorithm>#include<cstring>#define Fir first#define Sec second#define mp(x,y) make_pair(x,y)原创 2017-10-20 20:46:22 · 323 阅读 · 0 评论 -
[贪心] 51Nod1476 括号序列的最小代价
要看清问题的本质。 实际上就是每个位置有两个权值,规定有多少个取的是第1个权值,剩下取第2个权值,求权值和最小值。 还需要满足括号序列合法,即把(看作 11,) 看作 −1-1,所有前缀和都非负。 假如不管括号序列,就直接先把所有的都取第一种权值,然后按差值排序,贪心的取。 而括号序列只是限制了序列的每个前缀至少需要几个是(。 依然贪心就好了。先把待定的位置都设为)。从左到右扫,若当前前缀原创 2017-10-20 18:30:54 · 482 阅读 · 0 评论 -
[贪心] 51Nod1288 汽油补给
经典题吧…考虑最近的一个比当前位置便宜的,若能到达,就原地加油至刚好能到那个位置,然后过去。若加满油都到不了,就先原地加满油,在能到达的位置中选最便宜的去。 数据结构优化一下。#include<cstdio>#include<cmath>#include<algorithm>using namespace std;typedef long long LL;const int maxn=1原创 2017-10-20 15:12:16 · 549 阅读 · 0 评论 -
[贪心] 51Nod1380 夹克老爷的逢三抽一
这题需要一步转化,就变成和 BZOJ1150: [CTSC2007]数据备份Backup 一样了。但不太能直接想到。 为什么题意就等价于选一些不相邻的点呢? n个点的环,我们选中n/3个点,一定存在一个选中的点两侧有连续两个不选的的点,则我们把这个要选的点取掉,不会有两个要选的点变成相邻。 剩下的就是贪心啦。#include<cstdio>#include<queue>#include<a原创 2017-10-20 08:44:10 · 410 阅读 · 0 评论 -
[贪心+Trie] Codeforces #566A. Matching Names
首先考虑直觉的贪心,每次找 LCPLCP 尽量长的配对。是否正确呢? 考虑 aa 和 bb 的 LCPLCP 较长,cc 和 dd 较短,如果我们互换组合,一定不会使答案增大,所以大概可以感受到贪心是对的。 接下来就是实现的问题了。容易想到 TrieTrie。我们可以从叶往根合并,中途进行匹配。#include<cstdio>#include<iostream>#include<algori原创 2017-10-19 14:57:35 · 455 阅读 · 0 评论 -
[杂题 贪心] Codeforces 808E. Selling Souvenirs
思路题,很秒的想法。就是一个普通的背包模型,但物品大小只有 1,2,31,2,3 这 33 种。 考虑如果只有两种物品,就可以 O(n)O(n) 贪心了,所以考虑转换一下。 大小为 11 的物品或取奇数个,或取偶数个。枚举奇偶,然后可以把两个1一起取,即合并成2。 这样就变成只有两种的情况了。#include<cstdio>#include<algorithm>using namespac原创 2017-10-09 16:16:32 · 323 阅读 · 0 评论 -
[贪心] Codeforces #527D. Clique Problem
这题虽然简单,但思路很好。 首先肯定研究一下这个条件,尝试发现一些结论。 容易想到,若i<j<ki<j<k,ii 到 jj 有边,jj 到 kk 右边,则 ii 到 kk 一定有边。 这样问题就转化成,求一个从左到右的最长路。其中相邻点 i<ji<j 满足 xi−xj≥wi+wjx_i-x_j\ge w_i+w_j。 分析到这里已经可以做了,直接 DPDP ,用树状数组优化一下,可以一个 l原创 2017-10-18 10:45:18 · 293 阅读 · 0 评论 -
[贪心] BZOJ2006: [NOI2010]超级钢琴
经典题。 超级钢琴模型。取前k个最优的问题,总状态太多时,尽量根据显然的优劣关系,减少当前待选最优值,用堆搞,取了一个之后放出后续可能有用的。#include<cstdio>#include<queue>#include<cmath>#include<algorithm>#define Fir first#define Sec secondusing namespace std;con原创 2017-09-19 18:07:09 · 416 阅读 · 0 评论 -
[背包 贪心] Codeforces #365D. Free Market
思维题。 首先要挖掘一下性质,这个交换的操作限制很大,较难处理。 可以发现,我们进行一次交换,价值总和增长不会超过 dd 。 若我们要从 SS 变到 TT,需用 S−S∩TS-S \cap T 交换得 T−S∩TT-S \cap T ,需满足 Sum(S−S∩T)+d≥Sum(T−S∩T)→Sum(S)+d≥Sum(T)Sum(S-S \cap T)+d \ge Sum(T-S \cap T原创 2017-11-03 22:13:11 · 473 阅读 · 0 评论