区间贪心

区间贪心:最多不相交区间、区间选点、区间合并、区间覆盖、区间分组 本文总结了C++中区间贪心算法的常见类型及解法:1)不相交区间选择(单组/多组),按右端点排序后贪心;2)区间选点问题,包括最少覆盖点和区间分配点;3)区间合并,按左端点排序后处理;4)区间覆盖,优先选择覆盖当前点且右端点最大的区间;5)区间分组,所有区间必须分组求最小组数。每种类型都给出了核心性质、算法思路及时间复杂度分析,并附相关例题。这些方法在解决如座位安排、毯子覆盖等问题中具有广泛应用。 阅读详情

目录

1.贪心算法的思想

2.区间贪心算法常用的一些题目类型

1.选择最多不相交区间问题

P2970 [USACO09DEC] Selfish Grazing S

 1.思路分析

2.上代码

2.区间选点问题

P1250 种树

1.题目

2.方法一

1.代码解释

 3.方法二

3.区间合并问题

P2434 [SDOI2005] 区间

1. 思路分析

2.上代码

4.区间覆盖问题

 P1668 [USACO04DEC] Cleaning Shifts S

1.思路分析

 2.代码解释

5.区间分组

T471772 cici排课

​编辑 1.一点点思路

2.代码实现与算法思路

3.举一反三

3.遇到了(区间)贪心的题我们应该怎么做

end👍🏻⭐ok?


1.贪心算法的思想

贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优值(或较优值)的1种求解问题策略,即贪心策略。

2.区间贪心算法常用的一些题目类型

1.选择最多不相交区间问题

P2970 [USACO09DEC] Selfish Grazing S

洛谷:P2970 [USACO09DEC] Selfish Grazing S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2970

 1.思路分析

题题目的大概意思就是给定我们N个区间,求最多不相交区间有多少个。

我们可以按照区间的右端点从小到大排序

 然后我们创建一个变量命名为j和一个变量cnt(计数),再次循环整个结构体(输入的那些区间,已经排序完), 如果循环到的这个区间的左端点在标签变量j的右边,把j更新为这个区间的左端点,cnt++

2.上代码
#include <bits/stdc++.h>
using namespace std;
struct M{
    int s,e;
}a[500005];
bool cmp(M x,M y){
    return x.e <y.e;
}
int main(){
    int n;
    cin >> n;
    for(int i =0; i < n; i++){
        cin >> a[i].s >> a[i].e;
    }
    sort(a,a+n,cmp);
    int j = -1,cnt = 0;
    for (int i =0; i < n; i++){
        if (a[i].s >= j){
            j = a[i].e;
            cnt ++;
        }
    }
    cout << cnt;
    return 0;
}

2.区间选点问题

P1250 种树

洛谷:

P1250 种树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1250

1.题目

 

2.方法一

 把所有树都往右边种,为了让他们重叠区间的更多,而且重叠的部分大部分都在右侧,我们就要让这些区间按右端点,从小到大排序,下图是我列举的样例。

首先先把样例归一整一下(排序)

123456789
【||】
【|】
【|】
【】

从第一个开始在尾巴上种树,如果这个区间内已经种到了t[i]棵的话就不种了 , 如果没有种到这么多棵树那就得从后往前,循环种树只要种到为止.(括号代表已经种上树了,+1代表多种一棵树)

123456789
【|(|)+1(】)+1
(【)(|)(】)被底下的人种上了
(【)(|)+1】
(【)+1(】)+1

其实这样的话更形象,就是有点乱:

123456789
([)|(|[)(]|[)(]|)]([)(])

 同样颜色是一个区间

贪心加模拟的思想

1.代码解释
#include <bits/stdc++.h>
using namespace std;
bool v[100005];
struct Sa{
    int a,b,c;
}s[100005];
bool cmp(Sa x,Sa y){
    return x.b < y.b;
}

我定义了一个叫做s的 结构体,s[i].a = b,s[i].b = e,s[i].c = t(这些值和题目中的数);

这一段代码靠下的cmp是排序函数

v数组就是大街,就是那个有点乱的图

___________________________优雅的分界线_______________________

输入+排序 

int main(){
	int q;
    int n;
	cin >> q>> n;
    for (int i =1; i <= n; i++){
        cin >> s[i].a >> s[i].b >> s[i].c;
    }
    sort(s+1,s+n+1,cmp);

___________________________优雅的分界线_______________________

    int cnt = 0;
    for (int i = 1; i <= n; i++){
    	int sum = 0;
    	for (int j = s[i].a; j <= s[i].b; j++){
    		if (v[j]) sum ++;
		}
		if (sum >= s[i].c){
			continue;
		}

 循环的第一部分, sum的值是在这个区间内种了多少棵树,如果已经种够了那就不用循环这一次看下一次区间.

___________________________优雅的分界线_______________________

		sum = s[i].c - sum;
		cnt += sum;
    	for (int j = s[i].b; j >= s[i].a; j--){
    		if (v[j] == 0){
    			sum --;
    			v[j] = 1;
    			
			}
			if (sum == 0){
				break;
			}
		}

 循环的第二部分,sum值变成还差多少棵树,总共棵数增加sum,循环种树(倒过来循环);

___________________________优雅的分界线_______________________

最后输出cnt;

___________________________优雅的分界线_______________________

总体代码

#include <bits/stdc++.h>
using namespace std;
bool v[100005];
struct Sa{
    int a,b,c;
}s[100005];
bool cmp(Sa x,Sa y){
    return x.b < y.b;
}
int main(){
	int q;
    int n;
	cin >> q>> n;
    for (int i =1; i <= n; i++){
        cin >> s[i].a >> s[i].b >> s[i].c;
    }
    sort(s+1,s+n+1,cmp);
    int cnt = 0;
    for (int i = 1; i <= n; i++){
    	int sum = 0;
    	for (int j = s[i].a; j <= s[i].b; j++){
    		if (v[j]) sum ++;
		}
		if (sum >= s[i].c){
			continue;
		}
		sum = s[i].c - sum;
		cnt += sum;
    	for (int j = s[i].b; j >= s[i].a; j--){
    		if (v[j] == 0){
    			sum --;
    			v[j] = 1;
    			
			}
			if (sum == 0){
				break;
			}
		}
	}
	cout << cnt;
    return 0;
}
 3.方法二

换1种方法可以反过来运算,就像加有减,除有乘

也就是从左到右去种树,排序的时候按照左端点从小到大排序,

直接演示代码吧!

#include <bits/stdc++.h>
using namespace std;
bool v[100005];
struct Sa{
    int a,b,c;
}s[100005];
bool cmp(Sa x,Sa y){
    return x.a > y.a;
}
int main(){
	int q;
    int n;
	cin >> q>> n;
    for (int i =1; i <= n; i++){
        cin >> s[i].a >> s[i].b >> s[i].c;
    }
    sort(s+1,s+n+1,cmp);
    int cnt = 0;
    for (int i = 1; i <= n; i++){
    	int sum = 0;
    	for (int j = s[i].a; j <= s[i].b; j++){
    		if (v[j]) sum ++;
		}
		if (sum >= s[i].c){
			continue;
		}
		sum = s[i].c - sum;
		cnt += sum;
    	for (int j = s[i].a; j <= s[i].b; j++){
    		if (v[j] == 0){
    			sum --;
    			v[j] = 1;
    			
			}
			if (sum == 0){
				break;
			}
		}
	}
	cout << cnt;
    return 0;
}

3.区间合并问题

P2434 [SDOI2005] 区间

网址:

P2434 [SDOI2005] 区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2434

 

1. 思路分析

给出若干个区间让我们输出它们可以合并出来最少的区间(个数,但是输出区间)。

1.按照左端点排序

2.排序完了以后定义两个变量L和R,L=第一个区间的左端点,R=第一个区间的右端点

3.遍历一遍这些区间(不包含第一个)

4.如果这个区间的左端点(开端),大于了R(这个区间不在我们L~R里不包含它),输出L和R,把L的值更新为这个区间的左端点(更新一下整个区间)

5. R的值和区间的右端点做比较选取最大的那个值更新R

2.上代码
#include <bits/stdc++.h>
using namespace std;
struct B{
    int l,r;
}a[1000005];
bool cmp(B x, B y){
    return x.l < y.l;
}
int main(){
    int n;
    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> a[i].l >> a[i].r;
    }
    sort(a,a+n,cmp);
    int R = a[0].r,L = a[0].l;
    for (int i=1; i <n ; i++){
        if (a[i].l > R){
            cout << L << " " << R << "\n";
            L = a[i].l;
        }
            R = max(a[i].r,R);
    }
    cout << L << " " << R << "\n";
    return 0;
}

4.区间覆盖问题

 P1668 [USACO04DEC] Cleaning Shifts S

 P1668 [USACO04DEC] Cleaning Shifts S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1668

这道题题目的意思是:给定我们一个区间1~T,我们有N个小区间,请问需要最少几个小区间可以覆盖整个大区间(1~T),请注意两个区间之间可以差一,只要每个时间段都有奶牛也可以,比如(1,2)(3,4)它们就可以并到一起去。虽然它讲起来是时间段但是它做起来是时间点。

1.思路分析

图片分析请看下图

 2.代码解释
#include <bits/stdc++.h>
using namespace std;
struct Sa{
    int a,b;
}s[100005];
bool cmp(Sa x,Sa y){
    return x.a < y.a;
}
int main(){
    int n,t;
    cin >> n >> t;
    int cnt=0;
    for (int i= 1; i <= n; i++){
        cin >> s[i].a >> s[i].b;
        
    }
    sort(s+1,s+n+1,cmp);

结构体函数+排序函数cmp按照左端点从小到大排+输入与排序

int l = 1,r = -1;
    for (int i = 1; i <= n;){
        if (s[i].a > l){
            cout <<-1;
            return 0;
        }

如果左端点最靠前的那个区间,左端点还是大于L,说明整个区间结构体没有一个左端点小于等于L,输出负一不能实现


        while (i <= n and s[i].a <= l){
            r = max(s[i].b,r);
            i++;
        }
        cnt ++;

去看,左端点小于等于,而且右端点是最大的.增加区间段数(cnt).


        if (r >= t){
            cout << cnt;
            return 0;
        }
        l = r +1;
    }

如果我们的最大值已经超过了T输出cnt,把L更新为r+1.

cout << -1;
    return 0;
}

对如果在循环里都没结束的话,说明不可以实现输出-1

 总体代码

#include <bits/stdc++.h>
using namespace std;
struct Sa{
    int a,b;
}s[100005];
bool cmp(Sa x,Sa y){
    return x.a < y.a;
}
int main(){
    int n,t;
    cin >> n >> t;
    int cnt=0;
    for (int i= 1; i <= n; i++){
        cin >> s[i].a >> s[i].b;
        
    }
    sort(s+1,s+n+1,cmp);
    int l = 1,r = -1;
    for (int i = 1; i <= n;){
        if (s[i].a > l){
            cout <<-1;
            return 0;
        }
        while (i <= n and s[i].a <= l){
            r = max(s[i].b,r);
            i++;
        }
        cnt ++;
        if (r >= t){
            cout << cnt;
            return 0;
        }
        l = r +1;
    }
    cout << -1;
    return 0;
}

5.区间分组

呃……,这道题你们就看图片吧!

T471772 cici排课

 1.一点点思路

这个题目不在于老师的编号是多少哪个老师该上哪节课,只用求出老师的个数就行。

只要有课程下课了的话我们就可以释放老师,如果释放了新课,既要把新课排给被释放的老师.

2.代码实现与算法思路

#思路

我们输给两个数组(a,b),注意在这里不要用区间的眼光看这两个数组, 数组要分开来排序, a从小到大排序b也从小到大排序,定义一个变量cnt(老师数量)然后循环:

a的i号位的数与b的第j号位对比,如果小于等于B的第j号位{

        cnt++

        查看a的i+1号位//也就是i++;

}//这个循环也就是循环到a[i]>b[j],看一看在b[j]这个课结束之前,还会上多少节课

如果b[j]比a[i]为小的话{//也就是说有老师被释放出来了

        cnt --

        j++;//看下一位

}

#代码实现,增加一些判断我会进行注释 

为什么要求最大值,因为这种方法是最值的,而求最大值是要求这种最值方法需要多少名老师

#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main(){
    int n;
    cin >> n;
    for (int i =0; i < n; i++){
        cin >> a[i] >> b[i];
    }
    sort(a,a+n);
    sort(b,b+n);
    int i = 0,j = 0,big = -1,cnt = 0;
    while (1){
        while (i < n and a[i] <= b[j]){
            cnt ++;
            big = max(cnt,big);//求最大值
            i ++;
        }
        if (i >= n) break;  //如果要上的课都检查完了就退出输出最大值
        while (j < n and b[j] < a[i]){
            cnt --;
            j ++;
        }
    }
    cout << big;
    return 0;
}
3.举一反三

这道题会让我们想起“匹配括号”,虽然不知道这个题名字叫做什么,但是题目的大致意思如下:

输入一个字符串字符串用“(”和“)”组成,“(”和“)”可以形成一组,请问输入的字符串有没有多余的括号。如果没有输出“yes”如果有输出“no”(不加引号)。

就比如输入:

((())())

很明显是匹配上了的

请看下列表格是我们这道题的算法,左括号加一,右括号减一

((())())
12321210

如果最后等于零的话就可以匹配成功.

不过你可能会问这道题和cici排课有什么关系 ,你可以把题目改编一下变成:

还是输入一个字符串,每一个符号(左括号、右括号)之间,输出我们的cnt最大值。

我们借鉴上面的表格,这个题目就可以输出3

而我们的CiCi排课也是同样的道理,左括号是开始上课,右括号是结束上课,问你老师人数的最大值.

3.遇到了(区间)贪心的题我们应该怎么做

找出我们要排序的顺序按什么排序,

再进行循环,加入题目的要求

最后说一句特殊题目特殊判断,一定要变得灵活起来.

end👍🏻⭐

2017全国大学生电子设计大赛B题 | 板球控制系统(四)机械设计相关 转载请注明出处。   转眼2019了诶,可能有些同学又该问了,哇向阳哥,你这个鸽子放的好,转眼大半年了一年都没更新,我也知道啊,说好的源码呢,挖的机械的坑呢?咕咕咕咕我也不想啊,我这不是懒吗!过年有空了,又到了收红包泡妹子玩游戏.......呸,学习准备比赛码代码的时候了,终于有点空闲,于是乎今晚先把机械的大坑填了。     咱话先说在最前面。机械这玩意,靠经验,也考想象力,更要命的还是出了... 阅读详情

相关推荐

TPAMI审稿人关注什么

写在开头:被tpami接收大概是每个cs er最开心的事情吧!今天阅读TPAMI的文章时,发现有扩刊的文章,也有不是扩刊的文章,那么这两类文章哪个更容易被接收呢?

carlous0的专栏 1687

[bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路

Cleaning Shifts bzoj-3389 Usaco-2004Dec 题目大意:每天有n个时间段,每个时间段都必须安排一个奶牛值班。有m个奶牛,每个奶牛只有一个空闲时间s[i]~e[i],求至少动用多少奶牛。 注释:$1\le n\le 10^6$,$1\le m\le 25,000$。 想法:神题 我们将所有的时间点排成一排,然后对每一个i+1向i连一条无代价的边。 ...

dianan0938的博客 177

OpenGL纹理贴图

OpenGL纹理1. 基本概念2. 纹理环绕方式3. 纹理过滤3.1 GL_NEAREST3.2 GL_LINEAR3.3 多级渐远纹理 (Mipmap)4. 纹理加载与创建4.1 纹理加载4.2 纹理创建4.3 纹理的使用 1. 基本概念 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来表示物体的细节特征,希望绘制一个有足够多细节的物体,当然可以用足够多的顶点颜色来描述,但是无疑也增加了许多额外的开销;另一种办法就是使用纹理。 学习之前先展示一张实现的纹理图以更好理解纹理! 还是这张图为了将纹

牵LV小猪精的博客 8931

贪心问题总结

经典问题 排队接水问题 问题描述 nnn 个人在一个水龙头前排队接水,假如每个人接水的时间为 TiT_iTi​,找出一个排队顺序,使得 nnn 个人的等待时间之和最少。 思路 每个人的等待时间为前面人的接水时间之和,排队越靠前被计算次数越多,因此越小的排在前面显然是最优的。 选择不相交区间 问题描述 数轴上有 nnn 个开区间 (li,ri)(l_i, r_i)(li​,ri​),从中选出尽量多的区间,使得选出的这些区间两两没有交点。 思路 若区间相互包含,即区间 xxx 完全包含 yyy。那么选择 xxx

Happig的博客 643

Ubuntu22.04 网络图标消失与连接故障排查指南(附实战修复流程)

本文详细介绍了Ubuntu22.04系统中网络图标消失与连接故障的排查与修复方法。通过ifconfig、dhclient等命令诊断问题,提供从紧急恢复网络连接到深度排查的完整解决方案,帮助用户快速恢复网络功能并预防类似问题再次发生。

weixin_28481133的博客 289

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6451

P1668 [USACO04DEC] Cleaning Shifts S 题解

好题

guozhetao的博客 996

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1902

906. 区间分组

给定NN个闭区间[ai,bi][ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。 输出最小组数。 输入格式 第一行包含整数NN,表示区间数。 接下来NN行,每行包含两个整数ai,biai,bi,表示一个区间的两个端点。 输出格式 输出一个整数,表示最小组数。 数据范围 1≤N≤1051≤N≤105, −109≤ai≤bi≤109−109≤ai≤bi≤109 输入样例: 3 -1 1 2 4 3 5 输出样例:...

fanlangke的博客 282

【Flutter 面试题】 怎么减少Widget的重新构建?

关于 const 关键字的使用:在 Flutter 开发中,任何时候当你确定一个 Widget 在其整个生命周期内都不会发生变化时,使用 const 关键字声明这个 Widget。这样的声明告诉 Flutter 框架这个 Widget 可以在编译时生成,后续的构建周期中可以重用已经创建的 Widget,从而避免了重复的构建开销。这适用于静态文本、图标或整个不变的 Widget 树。

Code Metaverse 1577

【问题解决】Python 异步 asyncio 卡死、协程不执行、任务泄漏,保姆级排错

本文详细分析了Python异步编程中常见的卡死、协程不执行和任务泄漏问题。文章首先列举了这些问题的典型表现,如程序卡住、死锁、任务未启动等。然后深入剖析了各类问题的根源,包括同步阻塞操作、未正确await、资源未清理等。针对这些问题,文章提供了两套解决方案:一是异步编程最佳实践,包括安全协程执行、带超时的执行、任务清理等实用方法;二是死锁检测和预防机制,通过锁管理和等待图分析来避免死锁。文章还包含可直接使用的代码示例,帮助开发者快速定位和解决异步编程中的常见问题。

博客 451

洛谷P2970 [USACO09DEC]自私的放牧Selfish Grazing

洛谷P2970 [USACO09DEC]自私的放牧Selfish Grazing 一道贪心题 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <iostream> 6 #...

weixin_33796177的博客 182

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】

如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

MISAYAONE的博客 1万+

贪心——区间选点

本文介绍了贪心中的区间类问题

2301_80358171的博客 1620

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[区间问题] 区间覆盖(区间问题+贪心)

文章目录0. 前言1. 区间问题+贪心 0. 前言 玄学的贪心问题,一般全凭直觉。 贪心问题没有固定讨论,没有模板,见多了就好了,证明想法的正确性是很困难的,大多采用反证法。 区间问题无非左端点、右端点、左右端点排序… 1. 区间问题+贪心 907. 区间覆盖 贪心思路: 区间按左端点从小到大排序 从前往后依次枚举每个区间 在所有能覆盖 start 的区间中,选择右端点最大的区间,然后将 start 更新成右端点的最大值 证明: 假设最优解为 ans 个区间,以上述贪心思路选出来的区间为 cn

Y-puyu 的博客 6521

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

贪心·区间问题

c++贪心·区间问题

Lucky_Threewsr的博客 1109

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

区间贪心2

【代码】区间贪心2。

Z优快云HJKS的博客 1194

区间问题(贪心)

文章目录前言一、贪心二、例题,代码AcWing 905. 区间选点本题分析AC代码AcWing 908. 最大不相交区间数量本题分析AC代码AcWing 906. 区间分组本题分析AC代码AcWing 907. 区间覆盖本题分析AC代码三、时间复杂度 前言 复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。 一、贪心 贪心:利益最大化,即找到最优的情况,贪心问题难在证明,即你可能能推断出这个题目的正确解法,但是这个解法下为.

佛系更新 1663

【贪心】整数区间

Description 我们定义一个整数区间[a,b]:是一个从a开始至b 结束的连续整数的集合。编一个程序,对给定的 n(n≤1000 )个区间,找出满足下述条件的所含元素个数最少的集合中元素的个数:对于所给定的每一个区间,都至少有两个 不同的整数属于该集合。 Input 第一行一个正整数n,接下来有n行,每行给定一个区间的a,b值。 Output 一个正整数,满足条件的集合所包含的...

qq_43398760的博客 1088

贪心——区间问题

贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心之难,难如上青天,最好多见,多刷,多熟!

qq_57150526的博客 1375

贪心学习笔记之区间贪心问题

区间问题 区间方面的贪心前面已经学了很多,主要是根据区间的 l 或 r 进行排序,然后进行贪心处理; 这里要总结一下这些问题的一些做法; 1、 求给定的一些区间的最大不相交区间数量 这种题目一般都是按区间右端点从小到大来排序,然后依次枚举每个区间,判断就行;不可以按左端点来排序; 还有一种衍生题,问你选最少几个点,使这些点可以覆盖给出的所有区间,其实就是求区间的最大不相交数量; 模板题代码: #i...

不知所云的博客 375

一般贪心,区间贪心

月饼,贪心策略是单价。 #include "pch.h" #include <cstdio> #include<algorithm> using namespace std; const int maxn = 10000; struct Mooncake { double store;//库存量 double sell;//售价 double price;//单价 }mooncake[maxn]; int N; double need;//种类、最大需求 bool cm

kiss_the_rian的博客 191

简单贪心_区间贪心

区间贪心 - 简单介绍 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 简单来说就是以局部最优换取整体最优,相信大家对贪心算法都不陌生吧,下...

One of thre_tigers的博客 838

贪心算法之区间问题详解

目录 1.贪心算法简介 基本思想 局限性 2.经典例题 区间问题 贪心策略 3.代码 1.贪心算法简介 基本思想 1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。 2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。 局限性 贪心算法失效的很大一个原因在于它明显的局限性:它几乎只考虑局部最优解。 所谓局部最优,就是只考虑当前的最大利益,既

专注Spring、SSM、数据结构与算法、蓝桥杯领域创作者 3195

算法基础课—贪心(一)区间贪心、Huffman贪心

@[TOC]算法基础课—贪心(一)区间贪心、Huffman贪心 区间贪心 区间选点 题目 给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N,表示区间数。 接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。 输出格式 输出一个整数,表示所需的点的最小数量。 数据范围 1≤N≤105, −109≤ai≤bi≤109 输入样例: 3 -1 1 2 4 3

Yttttttttttttttt的博客 743
上一篇: 浏览器的一些功能
下一篇: 反弹球python小游戏
B757-300
博客等级 码龄4年 259粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值