
贪心
S atur
要变成萤火虫~
展开
-
Codeforces C. K-beautiful Strings (字符串反向贪心枚举) (Round #705 Div.2)
传送门题意: 给你一个长度为n的字符串s,要求你找到比s大的最小长度为n的字符串c,且必须满足c中每个字符出现的次数都能整除k,若找不到合法的字符串输出"-1"。思路:参考官方题解代码和大佬思路解析,细节见代码注释。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int原创 2021-03-07 15:40:05 · 324 阅读 · 0 评论 -
Codeforces C. Longest Simple Cycle (Round 103 Rated for Div.2)(贪心 / 思维)
传送门题意: 现有 n 条链,第 i 条链的头结点连接第 i-1 条链的第 a[i] 号点,其尾结点连接第 i-1 条链的第 b[i] 号点;先让你找出最大的环的边数。思路:从前往后扫一遍,求一个答案的最大值就好。如果当前链被下一条链连接的是同一个结点,那么表示环到当前位置必须结束了,且开始下一个环,更新中间答案 tmp == 0。扫描的过程中也要考虑在当前(每一条)链结束会不会答案更大的情况。同样还要注意,如果以当前链为环的起点会不会比前面的起点答案更大。具体细节都注释在代码中。原创 2021-02-02 17:53:59 · 173 阅读 · 1 评论 -
Codeforces C. Array Destruction (Round #696 Div.2)(构造&思维&贪心)
传送门题意: 问是否能选定一个初始值x,使得能按一定要求消除掉大小为 n*2 的数组所有值。要求:第一次删除两个数的和为x,以后每次删除的两数之和都为上次删除数的max。问是否能正好删除数组的所有值,并输出构造的删除顺序。思路:由于本题数据范围不大,可以考虑暴力的思维。每次删除的数必定是当前数组的最大值和另一个特定的数(两数之和必定等于上一轮删除的最大数),所以只要 x 确定后,之后的删除顺序便都确定了。而 x 就由第一次删除的两个数来决定,其中一个为整个数组的max,另一个便可以暴力枚举了。原创 2021-01-22 15:01:03 · 161 阅读 · 0 评论 -
Codeforces B. Different Divisors (Round #696 Div.2) (贪心&数学&质数)
传送门题意:寻找一个最小正整数a,使得a至少有4个因子,且其任意两个因子之间的差至少为整数d。思路:刚开始会错了题意,其实最少4个因子且因子间差至少为d的情况下,其实往往因子都为质数。对于第一个因子为1毋庸置疑,那么只需要找到另外两个质数a和b,满足它俩以及1之间的差距大于等于d即可,而答案就是a和b的最小公倍数。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long lo原创 2021-01-22 13:02:50 · 327 阅读 · 0 评论 -
Codeforces A. Puzzle From the Future (Round #696 Div.2) (贪心)
传送门题意: 给你一个长度为n的二进制串b,试找到一个相同长度的二进制a,使得a与b的按位相加得到的数d(可含前导零)最大,且要求d中相邻两数不能相同。例如:a = ‘0110’,b = ‘1101’,则d = ‘1211’,即真正的 d 为 ‘121’。思路:为了使得 d 最大,则需要让其保留最大位数(n位),且无前导零首位最大;于是a[0]一定等于’1’。再依次向后贪心,使得当前位 d[i] 不等于 d[i-1] 的情况下最大即可。代码实现:#include<bits/stdc+原创 2021-01-22 12:47:26 · 215 阅读 · 0 评论 -
Codeforces C. Circle of Monsters (思维贪心 / 前缀和)
传送门题意: 有n个怪兽围成一圈,第i个怪兽都有一个a[i]的生命值和一个b[i]的危害值。你只能选一个起点开始按准时针挨个击杀它们,每次击打伤害值为1。当某个怪兽的生命值<=0时就会爆炸对下一个怪兽产生b[i]的伤害,依次发生连锁反应。试问将所有怪兽击毙至少需要多少次攻击。思路:根据题意可知,只有挨着挨着按顺序击杀怪兽,而击杀所有怪兽的基本差值和是一定的,攻击次数主要取决于起点的选择。所有我们对起点进行枚举就好,记得在枚举是要先减去之前该点的差值再加该点的怪兽生命值a[i]。代码实现原创 2020-11-04 22:14:35 · 634 阅读 · 0 评论 -
Codeforces C. Array Splitting (Round 69 Rated for Div.2) (思维 / 贪心 | 差分)
传送门题意: 试图将一个非递减数列分成k段,使得每段的max-min的和最小,并求得最小值。思路:个人觉得是个贪心,过题后去看博客大多数都是差分思维。将所求的式子整理下就会发现每次的消耗都是每段的段尾减段首,而换个思维就是求 |整个数列的段尾减段首| 再减去期间k-1个缝隙的差的绝对值。那么我们就需要减经量多才会使得最后消耗min。于是我们将所有n-1个可能缝隙的差值排序,取绝对值前k-1大的数进行计算即可啦。代码实现:#include<bits/stdc++.h>#de原创 2020-10-27 01:41:05 · 197 阅读 · 0 评论 -
Codeforces C. Numbers on Whiteboard (Round 96 Rated for Div.2) (思维 / 贪心)
传送门题意: 现有1到n的n个数字,需要进行N-1次操作,每次选出两个数a与b删除,并把 (a+b)/2新加入集合中。求最后只剩一个数时的最小值。思路: 用一个优先队列,每次取出最大的两个数,并把他们和的1/2上取整新加入集合。真没想到这样能行(#.#),神奇鸭。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#def原创 2020-10-23 17:25:14 · 221 阅读 · 0 评论 -
L. Working Plan (优先队列 & 贪心思维 & 课表安排) ICPC Seoul 2018
思路:现有m个人和n天的课表,要求安排一个可行方案,满足第j天有d[j]个人工作,第i个人总共工作w[i]天。且每个人一开始工作就必须连续工作w天,然后至少休息h天才能工作。如果有可行解第一行输出"1",然后输出m行,每i行含w[i]/w个数,表示第i个人每次工作的开头那天;无解直接输出"-1"。从头按顺序开始安排每一天工作的任选,首选工作量最大的且可以工作(既没有在进行上一次工作,也休息了至少h天;且后w天都需要人工作)的人。这个时候就用一个优先队列来存m个人的当前工作量情况,且用一个队列过渡。.原创 2020-09-05 22:06:00 · 253 阅读 · 0 评论 -
Codeforces1401D Maximum Distributed Tree (树dfs & 贪心)
传送门题意: 给出一棵n个点的树,想让给每条边赋值,使得所有边权的乘积为k。因为k非常大,所有将k拆分成m个因子,换而言之就是n-1条边权的乘积得等于m个因子的乘积。定义f(x, y)为点x到点y的简单路径所经过的所有边的权值和,现问怎么安排边权,才能让所有简单路径的 f 值和 (即下图所示公式)最大,并得到该max值。思路:若m < n-1,那么剩下的边用1来填充。dfs找到每条边的经过次数,然后贪心一下将大的因子赋值给经过次数最多的边贡献就最多。至于经过次数的计算,可以将 u -原创 2020-09-02 23:22:02 · 179 阅读 · 0 评论 -
Codeforces D. Maximum Distributed Tree (树dfs & 边的利用次数)(Round #665 Div.2)
传送门题意: 给出一棵n个点的树,想让给每条边赋值,使得所有边权的乘积为k。因为k非常大,所有将k拆分成m个因子,换而言之就是n-1条边权的乘积得等于m个因子的乘积。定义f(x, y)为点x到点y的简单路径所经过的所有边的权值和,现问怎么安排边权,才能让所有简单路径的 f 值和 (即下图所示公式)最大,并得到该max值。思路:比赛的时候相叉了,后面快结束了才行到 idea, 但对树的相关操作不熟就这么错过了上高分分的机会,呜呜太菜了~若m < n-1,那么剩下的边用1来填充。dfs找原创 2020-08-22 19:48:02 · 233 阅读 · 0 评论 -
Codeforces C. A Cookie for You (模拟 / 分类 / 贪心) (Round #654 Div.2)
传送门题意: 主人住了两种饼干a,b块,现在邀请了两类客人n,m个。其中第一类客人喜欢吃多的饼干(相等的时候喜欢吃b),第二类客人喜欢吃少的饼干(相等的时候喜欢吃a)。如果有客人吃不到自己想吃的饼干就好生气,但显然主人不希望客人生气。 所以现在让你来判断是否有可行方案让客人不生气。思路:首先可判断饼干总数有没有客人总数多,再者因为二类客人喜欢吃少的,所以再判断min(a,b)是否有m多。先让m客人吃m个少类饼干,然后就只需要判断n客人是否生气了。再让n客人将多类的饼干吃得与少的一样,然后再交原创 2020-07-16 16:37:38 · 329 阅读 · 0 评论 -
Codeforces C. Create The Teams (排序 / 贪心) (Round 91 Rated for Div.2)
传送门题意: 给出一群人的能力值a[i],先让你给他们组队,要求每个队的能力值(人数 * 最小能力值)必须 >= x.试问最大可组多少个队伍?思路:先将数组a按升序排序,需要从后往前(大到小)来凑组(因为能力强者可以自成一队)。用变量记录当前组的成员数,以及当前组最小值得到答案。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int原创 2020-07-15 21:44:52 · 454 阅读 · 0 评论 -
acwing 913.排队打水(贪心)
传送门题意: 有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?思路:显然贪心就可以了,为了让总等待时间最短,那么就需要升序排队打水。不然若时间长者在前方的话,答案将加上(n - 1) * max,而相对于(n - 1) * min的话当然是升序排队打水最省时。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#原创 2020-07-14 23:27:10 · 408 阅读 · 0 评论 -
Codeforces D. Phoenix and Science (贪心 / 思维) (Round #638 Div.2)
传送门题意: 最开始有一个权重为1的细胞,每个细胞可以在白天选择分裂(或不分裂)成两个等权重的小细胞,但晚上每个细胞都必会增长一个权重。试问最少多少天所以细胞的权重和可以正好等于n?并输出每天进行分裂的细胞数目(满足条件的方案即可)。若不能正好等于n,则直接输出-1。思路:在第一天细胞可选择不分裂,则第二天总权重变成2;若选择分裂,则第二天总权重变成3。依次类推知要想尽快达到权重n,则应让每天晚上能增重的细胞数最多(即尽可能的分裂)。所以我们可以构造出每天分裂的细胞数列:2 ^ 0,2 ^原创 2020-07-08 00:12:54 · 185 阅读 · 0 评论 -
Codeforces D. Solve The Maze (bfs & 贪心) (Round #648 Div.2)
传送门题意: 现有一个n *m 的迷宫,期间 ’ # '表示墙壁, ’ . '表示道路 , ’ G '表示好人, ’ B '表示坏人。试问是否能通过将某些道路改建为墙壁,以让所有坏人不能从(n,m)出口逃出,而所有好人可以。思路: 这题看似很复杂,其实是有规律的。为了避免影响好人的逃亡,应该在坏人的四周建立围墙为了降低时间复杂度,应该以(n,m)为起点开始bfs(),标记所有能到达的点。最后遍历一遍,若有某个好人未被标记就是"NO",反之就是"YES"啦。代码实现:#include<原创 2020-06-11 18:12:16 · 226 阅读 · 0 评论 -
Codeforces C. Johnny and Another Rating Drop (二进制 / 贪心)(Round #647 Div.2)
传送门题意: 找到0 ~ n 的两两相邻数的二进制数的差异位数总和。思路: 不难看出其实每一位二进制数都有一定规律的。二进制第一位的贡献度为 n / (2 ^ 0)二进制第二位的贡献度为 n / (2 ^ 1)二进制第三位的贡献度为 n / (2 ^ 2)……如此遍历将每一位的贡献度加起来就是答案啦。代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#原创 2020-06-05 13:29:00 · 294 阅读 · 0 评论 -
Codeforces D. Yet Another Yet Another Task (区间和 / 贪心)(Round 88 Div.2)
传送门题意: 有一个区间a,找得到其(最大区间和sum - 区间内最大元素maxx)的最大值。思路: 每次遇到这周大范围的区间和问题就没辙,其实都是些很巧妙的思维因为答案ans的最小值为0,所以只需考虑正整数元素;又因元素max可在[1 ,30]范围,所以可以枚举maxx值,再枚举区间即可。若a[i] > maxx 则不符枚举目的,sum = 0(放弃前面的区间段)若sum < 0则不符最大值 >= 0,sum = 0代码实现:#include<bits/std原创 2020-06-04 14:44:34 · 165 阅读 · 0 评论 -
Codeforces C. Game On Leaves (贪心 / “博弈”) (Round #646 Div.2)
传送门题意: 给你一个n个节点的无根树和一个特殊节点x。Ayush和Ashish轮流在树上进行游戏:找到一个叶节点(度大于或等于零)将其删除(包括以其为端点的边),删除特殊点的就是赢家,且Ayush为先手。输出每个测试的赢家名字。思路: 这道题看起来是博弈,其实就是个贪心的思维题若特殊点就是叶节点则直接先手Ayush赢将特殊点看做根节点,必须删除其他n - 2个点后再看谁是先手谁就是赢家(也就相当于n % 2 == 0则最后一局依旧是Ayush先手,否则就是Ashish赢)。代码实现:#i原创 2020-06-02 16:57:08 · 222 阅读 · 0 评论 -
Codeforces G. A/B Matrix (贪心 / 思维) (Round #644 Div.3)
传送门题意: 给出 n, m, a, b四个数,试问是否可以列出一个每行a个1,每列b个1,其余全是0的 n * m的矩阵? 如果可以输出"YES"并打出一个可行的矩阵,否则输出"NO"。思路:显然只有横着数的n * a与竖着数的m * b相等才会有可行的方案然后每行一次填充a个1即可,每行的1相连,下一行的1紧接上一行1的后面。刚开始一直处理不好1的阶梯填充,后面才想通其实很简单,只需要每一行循环填充a次,直接找到 (p + 1) % m的位置即可。代码实现:#include <原创 2020-05-31 09:48:30 · 389 阅读 · 0 评论 -
耍杂技的牛
传送门题意: 农民约翰的N头奶牛(编号为1…N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。奶牛们不是非常有创意,只提出了一个杂技表演:叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。这N头奶牛中的每一头都有着自己的重量Wi以及自己的强壮程度Si。一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。您的任务是确定奶牛的排序,使原创 2020-05-29 12:16:29 · 327 阅读 · 0 评论 -
货仓选址(贪心 / 思维)
传送门题意: 在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。输入格式第一行输入整数N。第二行N个整数A1~AN。输出格式输出一个整数,表示距离之和的最小值。数据范围1≤N≤100000输入样例:46 2 9 1输出样例:12思路:问题可以转化为目标点与a[1]和a[n]之间的距离和,加上目标点与a[2]与a[n -原创 2020-05-28 23:21:20 · 530 阅读 · 0 评论 -
Huffman树:合并果子
传送门题意: 在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。达达决定把所有的果子合成一堆。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力原创 2020-05-28 09:26:03 · 219 阅读 · 0 评论 -
区间覆盖
传送门题意: 给定N个闭区间[ai,bi]以及一个线段区间[s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。输出最少区间数,如果无法完全覆盖则输出-1。输入格式第一行包含两个整数s和t,表示给定线段区间的两个端点。第二行包含整数N,表示给定区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示所需最少区间数。如果无解,则输出-1。数据范围1 ≤ N ≤ 10^5,−10^9 ≤ ai ≤ bi ≤ 10^9,−10^9 ≤ s ≤原创 2020-05-27 20:06:42 · 263 阅读 · 0 评论 -
区间分组
传送门题意:给定N个闭区间[ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。输出最小组数。输入格式第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示最小组数。数据范围1 ≤ N ≤ 10^5,−10^9 ≤ ai ≤ bi ≤ 10^9输入样例:3-1 12 43 5输出样例:2...原创 2020-05-26 10:19:13 · 529 阅读 · 0 评论 -
最大不相交区间数量
传送门题意:给定N个闭区间[ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。输出可选取区间的最大数量。输入格式第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示可选取区间的最大数量。数据范围1 ≤ N ≤ 10^5,−10^9 ≤ ai ≤ bi ≤ 10^9输入样例:3-1 12 43 5输出样例:2思路: 其实这个题我上一题的代码一摸一样,只不过是思考的角度和证明的方原创 2020-05-25 10:44:24 · 688 阅读 · 0 评论 -
区间选点
传送门题意:给定N个闭区间[ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。输入格式第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示所需的点的最小数量。数据范围1 ≤ N ≤ 10^5,−10^9 ≤ ai ≤ bi ≤ 10^9输入样例:3-1 12 43 5输出样例:2思路:将每个区间按右端点从小到大排序从原创 2020-05-25 10:09:13 · 346 阅读 · 0 评论