贪心
C202044zxy
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[nowcoder 2020] 牛半仙的魔塔(增强版)
一、题目点此看题二、解法值得一说的是本题的数据范围,你看他构造得这么恶心,就知道是为了避免某些情况。人的攻击力一定比怪高,那么人一定打的掉血。怪物的伤害很高,人无论如何都会掉血。这告诉我们只用求减免的伤害最多就行了,也不用多么麻烦的判无解(还没有无解的数据呢!)不妨从贪心的角度思考,俗话说的好:十个贪心九个排。想要知道最优的选取顺序,可以排序!推理排序规则的方法就是我们看最好的排列方法满足什么条件,然后按照这个条件排就可以了,现在我带着你们来推一推,假设i,ji,ji,j是两个相邻的怪物(iii先被原创 2020-10-24 15:22:15 · 578 阅读 · 0 评论 -
CF1203F2 Complete the Projects
一、题目点此看题原创 2020-08-11 09:00:41 · 214 阅读 · 0 评论 -
CF101D Castle
一、题目点此看题二、解法一看感觉就是贪心。主要问题在于确定访问子树的顺序,先访问的子树的会给后访问的子树叠加边权和的两倍,设这个值为fff,但还要考虑到子树大小,因为子树中的每个点都会增加这么多,综上可知比较的方法为:f[v0]×siz[v1]<f[v1]×siz[v0]f[v_0]\times siz[v_1]<f[v_1]\times siz[v_0]f[v0]×siz[v1]<f[v1]×siz[v0]然后就是据题意模拟统计即可。#include <cstd原创 2020-07-30 15:01:13 · 210 阅读 · 0 评论 -
CF77C Beavermuncher-0xFF
一、题目点此看题二、解法对于每一个点,要考虑他到子树的走法。由于这个点要被根走到才能产生贡献,所以先预留一个海狸让父亲能走过来(根就特判),然后贪心地走到贡献最大的子树中去(因为可能海狸个数不够访问所有子树)如果还有剩余,那么就跟儿子来回走刷贡献。#include <cstdio>#include <vector>#include <algorithm>using namespace std;const int M = 100005;#define i原创 2020-07-29 20:08:45 · 211 阅读 · 0 评论 -
CF949D Curfew
一、题目原创 2020-07-26 08:19:58 · 450 阅读 · 0 评论 -
CF248D Sweets for Everyone!
一、题目点此看题二、解法二分答案是显然的,但是检查有点难了,贪心地看,有这两种情况:原创 2020-07-25 10:32:46 · 190 阅读 · 0 评论 -
CF639D Bear and Contribution
一、题目点此看题二、解法先考虑可能的集合点,就是所有的aia_iai到ai+4a_i+4ai+4,我们把余数相同的归到一类,方便处理。对于每一类余数相同的,原创 2020-07-22 21:38:36 · 394 阅读 · 0 评论 -
CF173D Deputies
一、题目点此看题二、解法首先三个黑点、三个白点是肯定能能组队的,我们考虑白点数模333余111的情况(黑点如此同理)此时能够组队的方案有一白两黑,或者是222个两白一黑,都去试一试就行了,大于333的特殊配对(不是三个同色)肯定不用考虑,因为都能归类到上述情况中去。至于解决上述问题,贪心地找度数最小的白点///黑点,再看看能不能有两个点和他们组队。还有一个问题,就是第一个点染什么颜色会不会有影响?我们讨论连通块个数,111个显然无影响,222个不清楚,但是好枚举(都试试看,反正只有两种本质不同的情原创 2020-07-22 21:08:04 · 167 阅读 · 0 评论 -
CF1028E Restore Array
一、题目点此看题二、解法这道题主要考察构造,一种方法是从位置kkk展开,kkk填a[k]a[k]a[k],k−1k-1k−1填a[k]+a[k−1]a[k]+a[k-1]a[k]+a[k−1]…以此类推。这种构造需要保证a[k]>a[k−1],a[k]+a[k−1]>a[k−2]...a[k]>a[k-1],a[k]+a[k-1]>a[k-2]...a[k]>a[k−1],a[k]+a[k−1]>a[k−2]...,所以a[k]a[k]a[k]应该是最大的数并且前原创 2020-07-22 08:34:56 · 196 阅读 · 0 评论 -
CF449C Jzzhu and Apples
1原创 2020-07-22 08:25:33 · 155 阅读 · 0 评论 -
CF432E Square Tiling
一、题目点此看题二、解法外层枚举每个位置,拿到这个位置能填的最小的字符,然后贪心地填入最大的正方形。有一种特殊情况,如下图:这是黄色(B)是只填一格的,而红色(A)紧接着填入。#include <cstdio>const int M = 105;int read(){ int num=0,flag=1; char c; while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1; while(c原创 2020-07-21 21:01:12 · 290 阅读 · 0 评论 -
CF1369E DeadLee
一、题目点此看题二、解法这道题关键在于理解每个人会拿走所有还有的喜欢的菜品,这意味着如果出现了所有菜品都不够的情况,无解。简单证明一下,由于每个人会拿走所有还有的喜欢的菜品,所以每个菜品之间是独立的,这个菜品的选取不会影响到另一个菜品,所以最后总会出现不够的状态。如果有够的菜品呢?那我们就把强制喜欢这个菜品的人只拿这个菜品(把他安排到靠后),这样这个人就可以不用拿其他的菜品,这样一来,就会有新的菜品从不够变到够,类似一个拓扑排序的过程。#include <cstdio>#includ原创 2020-07-21 17:19:06 · 230 阅读 · 0 评论 -
CF1358E Are You Fired?
一、题目点此看题二、解法首先一个合法的答案一定是大于n2\frac{n}{2}2n的,因为若kkk可以,2k2k2k一定可以。然后把nnn分奇偶讨论,这里只讲奇数的情况,偶数学懂了自己推,请看下图:这是kkk最小的时候,当kkk增大时,某些部分会增加,某些部分会不合法。我们只需要判断最小的那个是不是正数,要增加都是一起增加的,所以相对大小是不会改变的,我们最开始时处理出的大小关系就可以一直用,这样复杂度就是O(n)O(n)O(n)在这里插入代码片...原创 2020-07-21 17:13:47 · 246 阅读 · 0 评论 -
CF1148E Earth Wind and Fire
一、题目点此看题二、解法首先排序,分配数如果交叉,那么肯定有不交叉的方案能够替换(这道题不要求操作数最小)。这说明排序后数组对应位置上的数最后也是对应起来的,这样问题就简化了。先判断无解,如果总和对不上,无解,sss前kkk个的和比ttt前kkk个的和大的话,无解(看作一个整体,只可能从后面分配到前面)然后维护两个指针,暴力分配即可,最多分配2n2n2n次。#include <cstdio>#include <algorithm>using namespace std原创 2020-07-21 10:43:15 · 240 阅读 · 0 评论 -
CF351E Jeff and Permutation
一、题目点此看题二、解法先把所有的数调成正数,答案不会改变。操作不会改变数的绝对值,我们可以从这个角度入手。每一个数只考虑比它小的数的贡献(就不会算重),如果一个数取正,那么后面的比他小的数无论如何都会产生逆序对(而前面的无论如何不会产生),如果一个数取负,那么前面比他小的数无论如何都会产生逆序对(而后面的无论如何不会产生),这样一来,我们只需要比较前面小的个数和后面小的个数,取最小值计入贡献即可。#include <cstdio>#include <algorithm>原创 2020-07-21 10:33:00 · 184 阅读 · 0 评论 -
CF798D Mike and distribution
一、题目点此看题原创 2020-07-21 10:19:46 · 223 阅读 · 0 评论 -
CF549G Happy Line
一、题目点此看题二、解法处理变化一个重要的方法就是寻找不变量,对于本题,ai+ia_i+iai+i就是不变的(换到前面aia_iai增大,后面aia_iai减小),为了单调不减,我们只能把ai+ia_i+iai+i最大的放在最后一位,次大的放在倒数第二位…这样一来,排个序就行了。这道题也很有趣,只会有一个解(说好的任意解呢?)#include <cstdio>#include <algorithm>using namespace std;const int M原创 2020-07-20 21:22:09 · 199 阅读 · 0 评论 -
CF226D The table
一、题目点此看题二、解法先定义sss为所有行和列的权值和。当你把行和列从负换成非负的时候,sss是一定增大的,可以说明当sss最大的时候行和列全部非负,否则还可以通过变换变得更大。这个做法的源头是什么呢?因为权值很小,变换最多变换值域次,实际跑得很快。还有一个启发,题面中说任意解很多情况都是唯一解。#include <cstdio>const int M = 105;int read(){ int num=0,flag=1; char c; while原创 2020-07-20 21:10:32 · 143 阅读 · 0 评论 -
CF1276C Beautiful Rectangle
一、题目点此看题二、解法考虑如果我们确定了行和列(行小),怎么填?最优的方法是斜着填,如下图(不同的颜色代表不同的值):每个数最多能填nnn次,可以看出只要个数够就一定能填。不确定行和列,我们可以枚举。枚举行,我们就知道每个数最多能填多少次,就知道最多填的总数(联系上文),可以反算出最大的列数。知道了行和列后答案就用斜着填的方法构造就行了,时间复杂度O(n)O(n)O(n)#include <cstdio>#include <algorithm>using name原创 2020-07-20 20:45:50 · 241 阅读 · 0 评论 -
[POI2011] Tree Rotations
一、题目点此看题解释一下这个输入,如果值为000那么递归地给出它的子树,否则给出叶子的权值。二、解法总的逆序对就等于所有子树的逆序对之和,而子树内的选择对子树外的选择没有影响,这给了我们贪心的可能,考虑换更好还是不换更好,维护一个权值线段树,在启发式合并的时候再统计换的个数和不换的个数。#include <cstdio>#include <iostream>using namespace std;#define ll long longconst int M = 2原创 2020-05-29 21:08:00 · 235 阅读 · 0 评论 -
[SDOI2015]寻宝游戏
一、题目点此看题二、解法本题其实是问一个极小联通子图总权值的222倍,有一个关键结论,如果我们把给定的关键点aaa按dfndfndfn排序,那么答案就是:dis(a1,a2)+dis(a2,a3)....+dis(an,a1)dis(a_1,a_2)+dis(a_2,a_3)....+dis(a_n,a_1)dis(a1,a2)+dis(a2,a3)....+dis(an,a1)这个结论也不难证明,主要利用了dfndfndfn相近的两点距离就较近(可以理解为一个贪心),那么我们就可以按d原创 2020-05-23 21:22:04 · 391 阅读 · 0 评论 -
[NOI2017]蔬菜
一、题目点此看题二、解法每个水果是逐渐变质的,我们可以想到不守交规这道贪心题,也就是我们先按权值从大到小排序,然后从变质的最后时间往前填充就行了,至于sss的额外收益,新建一个水果就行了。虽然变质是分阶段的,但是我们不需要把水果拆开,填充的时候逐渐增加水果的质量即可。我们还要用并查集优化填充的过程,填满mmm就不再填了。还有一个问题,我们只能针对一个固定的天数做这些操作,但是多组天数怎么办呢?我们可以先跑出一个极大天数填入的物品方案,对于一个较小的天数这些物品都是可以随便取的,iii天我们就取权值原创 2020-05-23 21:06:32 · 275 阅读 · 0 评论 -
HDU 3944 dp?
一、题目题目描述从杨辉三角的C(0,0)C(0,0)C(0,0)开始,每次只能向下走或者向右走,走到C(n,m)C(n,m)C(n,m)停止,求经过的权值和最小值,结果模一个质数ppp数据范围0≤k≤n≤1e9,1≤p≤1e40\leq k\leq n\leq 1e9,1\leq p\leq1e40≤k≤n≤1e9,1≤p≤1e4二、解法可以贪心,走过的111越少越好,首先有两条可能的...原创 2020-04-22 22:09:00 · 189 阅读 · 0 评论 -
[BalticOI 2004]Sequence
一、题目点此看题二、解法第一步可以把aia_iai和bib_ibi都减去iii,结果不会变,但是单调递增就变成了单调不减。考虑∣x−a∣+∣x−b∣|x-a|+|x-b|∣x−a∣+∣x−b∣之类的问题最优解就是取中位数(我们默认选后面那位),我们可以把原序列划分成若干的子序列,每一个子序列的中位数就是局部的最优解,需要满足单调不减。我们用可并堆维护中位数,我们每次加入一个点,当 前一...原创 2020-04-02 10:18:19 · 292 阅读 · 0 评论 -
[NOI2014]起床困难综合症
一、题目点此看题二、解法显然要用二进制贪心,我们从大到小地考虑每一位的选取情况。我们处理出第iii位选0/10/10/1最终得到的结果,O(n)O(n)O(n)跑一遍即可,然后如果选000产生贡献我们就直接加上贡献走人,否则选111产生贡献我们就看现在剩下的mmm还支不支持这一位选111,如果支持我们就加上贡献,再修改一下mmm。时间复杂度O(nlogn)O(n\log n)O(nlo...原创 2020-03-19 11:00:01 · 359 阅读 · 0 评论 -
准高速电车
一、题目点此看题二、解法首先对于每一个位置,它的路径一定是 快车->准快车->慢车,三段都可以为空。考虑把所有位置按照快车站的位置划分成若干段,对于每一段,我们先算出坐慢车最多到哪里,然后在下一个位置贪心地放一个准快车站,在算出从这个准快车站坐慢车的最远到达位置,然后重复上面的过程…选贡献最大地方放车站即可,对于每一个段我们只需要取最大的前k−mk-mk−m个,所以时间复杂度...原创 2020-03-05 15:48:28 · 383 阅读 · 0 评论 -
CF908F New Year and Rainbow Roads
一、题目点此看题二、解法首先我们肯定不会连接把蓝色和红色相连,因为这样是没有任何作用的。考虑两个相邻绿色的连接方式,具体来说有下面两种:两个绿色点直接相连绿->蓝->...->蓝->绿 或者 绿->红->...->红->绿选取更优的方案即可,也就是我们尝试用绿色直接相连的边替换中间最大蓝边和绿边,实现中我们就可以直接把相邻的蓝边//...原创 2020-02-09 12:26:00 · 596 阅读 · 3 评论 -
CF980E The Number Games
一、题目点此看题二、解法最重要的条件就是:第i个省出来的代表有2^i名粉丝,我们不能贪心删最小的叶子,而应该贪心倾尽全力保留编号最大的点。我们要维护一个联通块,nnn点肯定在其中,那我们可以nnn为根建这棵树,考虑从大到小加入点,一个点被加入联通块就需要它到根的路径都被加入联通块,我们查询它到根路径上未被加入的点数,看都加入会不会爆kkk的限制。别看数据1e61e61e6,树链剖分猛如虎...原创 2020-02-09 11:04:59 · 224 阅读 · 0 评论 -
CF924C Riverside Curio
一、题目点此看题二、解法玄学警告⚠,由于线上的数量是定值,转而求线的数量已推知线下数量。设t[i]t[i]t[i]为iii时刻线的数量,d[i]d[i]d[i]为线下的数量,易知 t[i]=m[i]+d[i]+1t[i]=m[i]+d[i]+1t[i]=m[i]+d[i]+1,有这样一些限制:t[i]≥t[i−1]t[i]\geq t[i-1]t[i]≥t[i−1],即线的数量单调递增...原创 2020-02-05 14:09:55 · 284 阅读 · 0 评论 -
CF1043E Train Hard, Win Easy
一、题目点此看题二、解法建议多读几遍题,读懂了之后会发现暴力算法是O(n2)O(n^2)O(n2)。考虑选取的条件,假设应该选取iii做第一道题,jjj做第二道题:xi+yj<yi+xjx_i+y_j<y_i+x_jxi+yj<yi+xjxi−yi<xj+yjx_i-y_i<x_j+y_jxi−yi<xj+yj你会发现这样选取的条件就取...原创 2020-01-31 15:32:51 · 279 阅读 · 0 评论 -
CF1054D Changing Array
一、题目点此看题二、解法把一个区间异或和用异或前缀和的方式表示:sum[r] xor sum[l−1]≠0sum[r]\space xor\space sum[l-1]\not=0sum[r] xor sum[l−1]=0正难则反,算出等于000的区间数再用总区间数减去即可。可以把sum[l−1]sum[l-1]sum[l−1]的值放入map...原创 2020-01-31 14:49:19 · 183 阅读 · 0 评论 -
[NOI2015]荷马史诗
一、题目点此看题二、解法这道题正解是哈夫曼树,我们定义每个元素有两个关键字,分别是 出现次数和树的高度(把每个元素看成一颗树),自小到大排序,然后取出最小的kkk个元素,将它们合并为一颗树,合并后的出现次数是这kkk个元素出现次数之后,深度是最大深度加1,塞回数据结构,下面给出贪心的正确性证明:出现次数最小的元素一定在哈夫曼树的最底端,否则我们可以通过交换操作使树的形态更优。合并之后塞...原创 2019-12-21 16:21:28 · 230 阅读 · 0 评论 -
[十二省联考2019]春节十二响
一、题目点此看题二、解法一道很好的子树内贪心的题目原创 2019-12-10 18:45:26 · 247 阅读 · 0 评论 -
[JOI 2017 Final]王国
一、题目二、解法考虑二分答案,我们把最小值强加于JOI\text{JOI}JOI,最大值强加于IOI\text{IOI}IOI。考虑怎样检查,先想一想势力范围应该如何划分。假设蓝色是JOI\text{JOI}JOI的势力范围,可以发现如果一列一列地区填的话,能填的行应该是单调递减的,既然我们已经二分了答案,为了减轻对面的负担,JOI\text{JOI}JOI肯定拿的越多越好,所以我们就...原创 2019-11-30 16:05:45 · 313 阅读 · 0 评论 -
划分
一、题目点此看题二、解法0x01 考场的想法考虑到划分的段是递增的,设dp[i][j]dp[i][j]dp[i][j]为划分到第iii个的前驱是jjj,转移:dp[i][j]=dp[j][k]+(sum[i]−sum[j])2dp[i][j]=dp[j][k]+(sum[i]-sum[j])^2dp[i][j]=dp[j][k]+(sum[i]−sum[j])2判一下递增,暴力转移时间...原创 2019-11-19 21:17:44 · 183 阅读 · 0 评论 -
专业网络
可以用暴力+乱贪心过掉454545分。方法1 不守交规可以用不守交规的贪心模型,简而言之,就是先把bbb从大到小排序,然后给他们安排位置,如果当前朋友被安排在aaa个朋友之后交,那么就不要花钱,否则就要花钱,把他安排在最前面交。所以我们就找a+1a+1a+1之后的空位,如果有,就安插进最近的空位,可以用并查集优化,时间复杂度O(nlogn)O(n\log n)O(nlogn)。证明的话...原创 2019-11-11 21:37:47 · 255 阅读 · 0 评论 -
糖果传递
一、题目点此看题二、解法设xix_ixi为iii号给i−1i-1i−1号xix_ixi颗糖果(如果为负则方向相反),让后我们可以列出下面的式子:a1−x1+x2=avea_1-x_1+x_2=avea1−x1+x2=ave……\dots \dots……ai−xi+xi+1=avea_i-x_i+x_{i+1}=aveai−xi+xi+1=ave发现有nnn个方程,nn...原创 2019-10-21 21:37:46 · 236 阅读 · 0 评论 -
兔子与樱花
一、题目点此看题二、解法我们发现删去一个点就会给它的父节点造成son[v]+c[v]−1son[v]+c[v]-1son[v]+c[v]−1的负担。我们遍历整棵树,贪心地看,我们选择删去的子节点的负担越小就越优,于是我们从小到大地删除子节点。但是增加了当前点的负担也给当前点的父亲的操作造成影响,那我们的贪心是错误的吗?其实更新当前点的更新对答案的贡献至少为1,而对于父节点的操作贡献影响至...原创 2019-10-21 20:59:54 · 366 阅读 · 0 评论 -
[JOISC 2017 Day 1] 烟花棒
一、题目点此看题二、解法这道题很容易想到二分答案,但是难点在于O(n)O(n)O(n)写checkcheckcheck函数(不是一般的毒瘤)。首先原创 2019-10-19 19:30:41 · 418 阅读 · 0 评论 -
观光公交
一、题目传送门二、解法这道题nnn比较小,我们考虑O(nk)O(nk)O(nk)的做法。我们考虑一个一个加入加速器,每次都选取最优的一个位置,然后再更新信息。我们考虑如何找这个最优的位置,发现只要是人等车的情况我们就可以用加速器,我们从用加速器的点开始找人等车的连续区间,这个可以用递推完成。找到了每个点对应的区间后,发现这段区间能让答案减少区间内乘客的数量,我们把每个乘客映射到区间中求前...原创 2019-09-13 16:28:06 · 221 阅读 · 0 评论
分享