贪心
seez
njfu
展开
-
1489. 田忌赛马 (贪心,区间dp)
题目:田忌赛马的故事,田忌每次输一局要付200元,赢一局获得200元,平局获得0元问,田忌和齐王都有n匹马的情况下,最多可以获得多少元1489. 田忌赛马 - AcWing题库由于田忌赛马的故事背景,我们很快就能够想到合理的贪心策略,上等马对中等马,下等马对上等马,所以可以将齐王和田忌的马都按照从大到小降序排序那么排序之后,对于田忌当前最大的马,如果比齐王最大的马还快,就用。如果田忌当前最大的马,如果比齐王最大的马还慢,就用田忌最小的马。证明: 当前都是按照降序排序,田忌目前的.原创 2022-02-16 13:41:08 · 920 阅读 · 0 评论 -
734.能量石(贪心,背包)
一个能量石有自己的l,e,s,可以想到01背包问题,由于01背包是线性递推的,思考有没有一种排序的方法,能够使得我们能够贪心的获得最多的能量?可以想到邻项交换法,通过交换两个能量石,查看能不能推出关系式如图可以得到关系式,得到后排个序,做一个01背包即可#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=10...原创 2022-02-15 16:40:04 · 155 阅读 · 0 评论 -
牛客寒假训练营 2 B(差分,并查集)
题意:有n个点,m条边,每次可以把m条边里面选一个放进入图中,然后每次可以使极大联通子图的权重+1,求最少权重+1的操作次数分析:由于min(5*n,m),那么所有边一定能够放进入图中,限制条件没有用限制条件:每次只能同时操作一个集合内的点 最后的所有需求都要减少为0由于每次只能同时操作一个集合内的点,那么可以想到并查集的思想,用并查集维护100. 增减序列(差分+贪心)_qq12323qweeqwe的博客-CSDN博客并查集扩展域:值域,维护一个集合共同的值由增减序列的..原创 2022-02-06 21:24:05 · 457 阅读 · 0 评论 -
codeforces 768 D (结论)
Problem - D - Codeforces题意:给定一个数组A,找出一个范围[x,y],把数组A恰好分为K块,使得每块中在范围[x,y]中的数>在范围外的数,并且最小化y-x,输出k个区间的左右端点分析:寻找一个范围[x,y] 然后运用结论用[x,y]分割区间 输出[x,y]找到一个范围[x,y]我们可以贪心的想,要找到k个数组,其实可以让每个数组在[x,y]的数in-在[x,y]外的数out>=1问题转化为了 : 找到k个区间,每个区间内在[x,y]的..原创 2022-02-02 17:57:25 · 453 阅读 · 0 评论 -
牛客寒假训练营 1 F中位数切分(结论)
原题链接中位数:一段区间[L,R],从小到大重新排列后处于中间位置的数那么发现一个性质,只要这段区间内>=m的个数比<m的个数多,中位数就>=m(区间长度为偶数时选择较小的,所以必须>)记cnt>0将一个区间[l,r]分为[l,mid],[mid+1,r],如果左右两个区间的cnt都>0,说明当前区间的cnt也>0,中位数>=m。证明:记????(????, ????)为原数组中???? ???? … ????[????]一段中的元素对原创 2022-02-02 12:17:55 · 401 阅读 · 0 评论 -
998.起床困难综合症(位运算,贪心)
原题链接题意:玩家的初始攻击力范围[0,m],求一个合理的初始攻击力获得的最大伤害值分析:位运算的一个特点是二进制下不进位,x0可以任意选择的情况下,ans的第几位是1/0仅与x0的第几位是1/0有关,和其他的无关,所以我们可以依次枚举每一位是0和1的情况哪个比较好来进行选择限制条件:初始值的范围必须在[0,m]内 贪心的想,为了初始值范围在范围内,1,0结果都为1时,优先选择0由于要求最大的伤害值,因为位运算不会进位,并且门的类型对答案也会有贡献,所以即使m很小,我们也要从2^29开始原创 2022-01-28 22:15:18 · 93 阅读 · 0 评论 -
牛客寒假训练营 1 J 小朋友做游戏(前缀和,贪心)
由于两个闹腾的小朋友不能放到一块,那么圆圈最多只能选择n/2个闹腾的小朋友(下取整)由于要求班级的幸福度最大,那么每次都要选择尽可能多的幸福度的小朋友其实是和这题类似的1239. 乘积最大(字符串贪心)_qq12323qweeqwe的博客-CSDN博客但是不同点在于,乘积最大是有负数的,所以这里可以采用其他的方法限制条件最多只能选n/2个闹腾的小朋友 安静的小朋友总数<n/2 直接失败因为幸福度是相加的,而我们要求最大幸福度之和,所以贪心的想,我们把安静的小朋友和闹腾...原创 2022-01-25 19:46:34 · 2263 阅读 · 0 评论 -
187. 导弹防御系统(lis+dfs)
注意每一套防御系统有两种选择1.严格单调上升2.严格单调下降我们发现数据范围很小,就可以使用枚举的思想,也就是对于一个系统要上升还是下降,都枚举一遍,取两个结果的最小值,所以使用dfs枚举的思想。dfs枚举有三个参数void dfs(int num,int un,int dn){//num当前导弹编号,un已配备的上升设备,dn已配备的下降设备 }注意!在这里寻找可以插入的元素中,其实是使用了一个贪心的思路以上升子序列为例就是找到能插入的元素中,..原创 2022-01-13 16:20:16 · 457 阅读 · 3 评论 -
896. 最长上升子序列 II(贪心+队列)
本题的数据范围是100000,如果用动态规划的思想肯定会超时我们想到了贪心+队列,时间复杂度O(nlogn)思想如下:一串数字,对于3来说,如果以他作为最长上升子序列的开头的话,不如以1作为最长上升子序列的开头,因为1更小,他的后面可以容纳更多的上升子序列那么有了这个思想,我们就可以维护一个队列,如果一个数比队列中的某一个数更小的话,我们就可以把他插入这个队列中替换原来的位置,变成以该数字结尾的一个上升子序列但是这样子会破坏原来的序列,我们只需要只需要用这个长度更新一下...原创 2022-01-07 21:11:18 · 725 阅读 · 0 评论 -
179. 最大数
class Solution {public: string largestNumber(vector<int>& nums) { sort(nums.begin(),nums.end(),[](const auto&a,const auto&b) { string ta=to_string(a); //转换为字符串 string tb=to_string(b)...原创 2022-01-02 21:43:07 · 149 阅读 · 0 评论 -
best cow line(字符串贪心)
题意:给定一个字符串,字符串只能移动左右端点放入一个字符串尾部,构造一个字典序最小的字符串分析:不断扫描左右端点,运用双指针,把左右端点字典序小的放入新的字符串里,当双指针重合的时候退出循环#include <iostream>#include <algorithm>using namespace std;const int N = 2005;int main(){ int n; cin >> n; string s; cin >&g..原创 2022-01-01 23:21:26 · 424 阅读 · 0 评论 -
基础贪心问题总结
贪心,就是取局部最优解,通常贪心问题能获得最优解的情况都是当前局部最优不会影响到全局最优,或者可以扩大到全局最优,如果从全局的角度来看,当前局部最优的选择策略是错误的,那么贪心算法就不适用了贪心问题就是不考虑全局,尽可能的选择某种属性的物品,只有当局部最优可以扩展到全局最优的时候,贪心的策略才是正确的主要有以下几种类型1.简单贪心简单贪心顾名思义就是我们可以很容易的做出某种选择,通常是考虑题目中的特性...原创 2022-01-02 22:17:21 · 1320 阅读 · 0 评论 -
leetcode 56. 合并区间(区间,贪心)
数组的长度是10^4,所以应该使用O(N)的做法题意:所有重叠的区间应该合并成一个区间,最后返回所有合并完后的区间这题不可以使用右端点升序排序,应该使用左端点升序排序如图所示我们知道,右端点的升序排序会导致next区间会完全大于当前区间,如果采用右端点升序排序,最后的结果是返回4个区间!不是最优解,这是因为小区间和区间之间有断点,那么,我们应该选用一种排序,让4这个大区间在前面,那么就是选择左端点升序排序了!!左端点升序排序,可能会出现2一样的比当前区间完全小的区间,那么不应该...原创 2022-01-01 18:39:19 · 468 阅读 · 0 评论 -
763. 划分字母区间(滑动窗口,贪心)
分析:运用滑动窗口的思想,开needs哈希表和窗口哈希表,由于要划分尽可能多的片段,那么只要当前窗口中全部元素都满足了needs的数量(同一字母只在一个片段中),就立即断开,保证尽可能多的数量class Solution {public: vector<int> partitionLabels(string s) { unordered_map<char,int> needs;//需求 unordered_map<char,in...原创 2022-01-01 15:23:40 · 350 阅读 · 0 评论 -
P1016 [NOIP1999 提高组] 旅行家的预算(贪心+模拟)
分析:详见代码#include <iostream>#include <algorithm>using namespace std;const int N = 500 + 5;struct node{ double s; //离出发点的距离 double p; //油站的油价 }mp[N];int main(){ double ed, c, d2, p; int n; cin >> ed >> c >...原创 2022-01-01 14:08:46 · 307 阅读 · 0 评论 -
455. 分发饼干
class Solution {public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(),g.end()); sort(s.begin(),s.end()); int cnt=0; for(int i=0,j=0;i<g.size();i++) { ...原创 2021-12-31 22:10:16 · 182 阅读 · 0 评论 -
127. 任务(贪心,二维区间选点问题)
分析:由于每一次收益是 500*x+2*y,500》》2,所以应该是以工作时间为第一关键字,任务难度为第二关键字排序那么要怎么贪心呢?1.先让任务按照时间降序排序注意这里第二个关键字也要降序排序2.由于x是第一关键字,y是第二关键字,不妨在所有满足条件的机器中选择任务难度最低的机器(为什么?因为我们让时间按照降序排序,此时所有能够满足当前任务的机器时间,也一定能够满足后面所有任务的时间,根据贪心的思想优先选择任务难度最低的机器)3.把选中的机器在集合里面删去这里运用了集合..原创 2021-12-30 19:31:22 · 417 阅读 · 0 评论 -
111. 畜栏预定(贪心,区间分组)
贪心:按照左端点排序(开始吃草时间),每一次都寻找能放入的栅栏中,结束时间最早的一个#include <iostream>#include <algorithm>#include <queue>#define x first#define y secondusing namespace std;const int N = 1e5 + 5;struct node{ int l, r; int note; bool ope...原创 2021-12-30 12:18:01 · 277 阅读 · 0 评论 -
P4447 [AHOI2018初中组]分组
题目分析:要选出最小分组的最大值,而不是要选出最小的一个分组,那样的话答案必然只会是1所以我们要尽可能的让队伍组成,又要减少孤立点的出现贪心:在所以可以插入的队伍中,选择队伍长度最小的插入2.ac代码贪心+队列贪心+队列时间复杂度是O(nm)m是队伍组数其实就是在所有的组数中,寻找满足两个条件的组1.队长最小2.可以插入(上一个插入的数==当前数-1)#include <iostream>#include <algorithm&g...原创 2021-11-07 14:51:51 · 574 阅读 · 0 评论 -
最大子段和(贪心,一维,二维)
1. 一维 P1115 最大子段和先从1开始遍历到n如果我们发现某一段的和是小于0的,就去掉这一段,从下个位置开始枚举每次新扩大一个窗口就更新一次答案,最后可以枚举到如图#include <iostream>#include <algorithm>using namespace std;const int N = 2e5 + 10;int a[N];int main(){ int MAX = -1e9; int n;...原创 2021-12-29 10:00:11 · 403 阅读 · 0 评论 -
1239. 乘积最大(字符串贪心)
本题中 x是整数,余数也是整数 x是负数,余数也是负数本题所有的情况1.全是正数2.全是负数3.既有负数也有整数下面讨论各种情况1.全是正数全是正数,直接选择最大的k个数就可以了2.全是负数3.既有正数也有负数和上面一样,k有两种可能,1.k是奇数,2.k是偶数那么,由于要选乘积最大,我们就尽可能的选择让答案是一个大的正数 贪心k不是一个正数的情况就只有区间的数全是负数1.k是偶数要让答案是一个正数,...原创 2021-12-28 18:43:35 · 461 阅读 · 0 评论 -
1235. 付账问题(贪心,均值不等式)
贪心:设ave为所有人要付的平均数 ,为 s/n设t为 (当前还没有付的钱/剩下没付的人)== (s-b1-b2...bi)/(n-i+1)那么我们的贪心操作是证明:既然要保证钱能够全部付完,那么t是要在每个人付完帐后都更新的,不能一直是ave,因为前面的人付完帐后,如果他的钱<ave,新的t是增大的,所以ai<=t而不是ai<=ave#include <iostream>#include <algor...原创 2021-12-28 12:39:46 · 432 阅读 · 0 评论 -
907. 区间覆盖
题意:给定一个线段区间和多个闭区间,选择尽可能少的闭区间完全覆盖这个线段区间猜想:1.如果当前区间和线段区间有交集,再执行第二步 2.如果当前区间的左端点<=上一个选的区间的右端点,再执行第三步 3.所有满足1,2条件的区间中,选择一个右端点最大的区间,使其加入,重复1,2操作证明:A==最小操作数1.A>=最小操作数,显然2.A<=最小操作数最差情况:每一个区间的l==上一个区间的r证明成立#incl...原创 2021-12-15 17:20:19 · 1106 阅读 · 0 评论 -
906. 区间分组
思路:最小堆:存在最小的右端点数组:按照左端点从小到大排序求最多组数 :就是让每个区间单独作为一组,没有意义求最少组数:让尽可能多的区间放在一个组里面,如果实在找不到一个可以放入的组,就自己创造一个新组同类型怎么找到可以放入的组呢?1.先排好序,按照右端点从小到大放入(右端点:我们用左端点遍历,最小堆弹出的是最小的右端点,如果有交集就不用往下找了)2.数组排好序后,用左端点遍历(为什么是左端点?因为让区间从坐标轴从左到右遍历)3.如果r[i].l<=弹出的右端点,新...原创 2021-12-15 16:46:21 · 2095 阅读 · 0 评论 -
908. 最大不相交区间数量
题目分析:1.让所有区间的右端点按从小到大开始排序 2.定义一个end,如果一个区间和end没有交集(l>end),就使得答案+1,然后让他的右端点成为新的end。如果有交集,就直接跳过 证明:类似于区间选点#include <iostream>#include <algorithm>using namespace std;const int N=100005;struct range{ ...原创 2021-12-15 16:13:18 · 133 阅读 · 0 评论 -
905 区间选点
题意:尽可能少的点,让所有的区间都至少有一个点贪心题:猜想+证明分析:1.让区间按照右端点的大小从小到大排序 2.如果一个区间没有被放入点,就在他的右端点放一个点,如果下一个区间的左端点小于上一次放入点的位置,就不需要再放入点了,反之则需要,在他的右端点放入一个点如果本次区间不能覆盖掉上次区间的右端点, ed < range[i].l说明需要选择一个新的点, res ++ ; ed = range[i]....原创 2021-12-15 12:56:49 · 927 阅读 · 0 评论 -
110. 防晒(区间选点,贪心)
有几种贪心的策略,但是不一定正确,首先我们要检验他们的正确性1.min升序排序,选择满足条件的防晒中spf最小的2.min降序排序,选择满足条件的防晒中spf最大的3.max降序排序,选择满足条件的防晒中spf最大的1.min升序排序,选择满足条件的防晒中spf最小的首先这里不选择spf最大的是因为简单可证,升序排序选spf最大的,一般情况下都是会取到下一个成员唯一能取的防晒的,所以不合理接下来是min升序排序的验证我们发现,min升序排序是会遇到下一个区间(next)是...原创 2021-12-26 18:19:36 · 481 阅读 · 0 评论 -
112. 雷达设备(区间选点)
题目分析过程 1.寻找性质,转化模型 2.求解模型问题转变为区间问题905 区间选点_qq12323qweeqwe的博客-CSDN博客等价于求最少区间选点首先,先把所有的区间都算出来for (int i = 0;i < n;i++) { int x, y; cin >> x >> y; //计算区间 if (y > d) flag = true; //一个点的...原创 2021-12-26 15:00:52 · 296 阅读 · 0 评论 -
122. 糖果传递
#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int N = 1e7 + 5;int a[N];typedef long long ll;ll s[N]; //s表示前缀和,需要开llll c[N]; //c表示常数数组,也需要开llint main(){ int n; ios::sync_with_stdio(fa...原创 2021-12-26 14:21:57 · 276 阅读 · 0 评论 -
125. 耍杂技的牛
证明过程如下#include <iostream>#include <algorithm>using namespace std;const int N = 50005;typedef long long ll;struct node{ int w, s; bool operator<(const node b)const { return w + s < b.w + b.s ? true : false;...原创 2021-12-25 19:11:05 · 265 阅读 · 0 评论 -
104. 货仓选址
#include <iostream>#include <cmath>#include <algorithm>using namespace std;const int N=100005;int a[N];typedef long long ll;int main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i];...原创 2021-12-25 18:48:34 · 265 阅读 · 0 评论 -
913. 排队打水(贪心,排列不等式)
推公式证明#include <iostream>#include <algorithm>using namespace std;const int N=100005;typedef long long ll;int a[N];int main(){ ll res=0; int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; ...原创 2021-12-25 18:33:42 · 351 阅读 · 0 评论