算法设计与分析——贪心算法——活动安排问题

算法分析与设计-会场安排问题(贪心)(通俗易懂,附源码和图解,含贪心选择性质和最优子结构性质的证明)(c++) 4-1 会场安排问题 (一)题目 问题描述 假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有着不同颜色的最小着色数,相当于要找的最少会场数。) 算法设计 对于给定的nnn个待安排活动,计算使用最少会场的时间。 数据输入 由文件input.txt提供输入数据。第1行中有一个整数nnn,表示有nnn个待安排的活动。接下来的nnn行中,每行有2个正整数,分别表示nnn个待 阅读详情

问题描述:设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi 。
如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。

贪心算法总是做出在当前看来是最好的选择,也就是说,贪心算法并不从整体最优上加以考虑,所做出的的选择只是某种意义上的局部最优选择;
虽然贪心算法不是对所有的问题都能得到整体最优解,但对范围相当广的许多问题都能产生最优解,即使贪心算法不能得到整体最优解,但其最终结果却是最终结果却是最优解的很好的近似解。

在这里插入图片描述

在这里插入图片描述
将活动按照结束时间进行从小到大排序。然后用i代表第i个活动,s[i]代表第i个活动开始时间,f[i]代表第i个活动的结束时间。按照从小到大排序,挑选出结束时间尽量早的活动,并且满足后一个活动的起始时间晚于前一个活动的结束时间,全部找出这些活动就是最大的相容活动子集合。

#include<iostream>
using namespace std;

void activity_arrangement(int n,int start[],int final[],bool result[])
{		//先按活动的结束时间排好序 
	int temp;
	 result[1]=true;
	 temp=1;
	 for(int i=2;i<=n;i++)
	 {
	 	if(final[temp]<=start[i])
	 	{
	 		result[i]=true;
	 		temp=i;
		}
		else
		{
			result[i]=false;
		}
	 }
	 
}

int main()
{
	int n;
	cout<<"输入活动的个数:";
	cin>>n; 
	
	int start[n+1];
	int final[n+1];
	cout<<"输入活动的开始时间序列:";
	for(int i=1;i<=n;i++)
	{
		cin>>start[i];
	}
	
	cout<<"输入活动的结束时间序列:";
	for(int i=1;i<=n;i++)
	{
		cin>>final[i];
	}
	bool result[n+1];
	
	activity_arrangement(n,start,final,result);
	
	for(int i=1;i<=n;i++)
	{
		cout<<result[i]<<" ";
	}
	
	return 0;
 } 

在这里插入图片描述
改进:能够自动进行排好结束时间

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

 typedef struct Node
{
	int start;
	int final;
}node;

bool cmp(node x,node y)
{
	if(x.final<y.final)
			return true;
	else
			return false;
}
void activity_arrangement(int n,int start[],int final[],bool result[])
{		//先按活动的结束时间排好序 
		Node node[n+1];
	for(int i=1;i<=n;i++)
	{
		node[i].start=start[i];
		node[i].final=final[i];
	}
	sort(node+1,node+n+1,cmp);
	 
	 for(int i=1;i<=n;i++)
	 {
	 	start[i]=node[i].start;
	
	 	final[i]=node[i].final;
	 }
	 
	 
	int temp;
	 result[1]=true;
	 temp=1;
	 for(int i=2;i<=n;i++)
	 {
	 	if(final[temp]<=start[i])
	 	{
	 		result[i]=true;
	 		temp=i;
		}
		else
		{
			result[i]=false;
		}
	 }
	 
}

int main()
{
	int n;
	cout<<"输入活动的个数:";
	cin>>n; 
	
	int start[n+1];
	int final[n+1];
	cout<<"输入活动的开始时间序列:";
	for(int i=1;i<=n;i++)
	{
		cin>>start[i];
	}
	
	cout<<"输入活动的结束时间序列:";
	for(int i=1;i<=n;i++)
	{
		cin>>final[i];
	}
	bool result[n+1];
	
	activity_arrangement(n,start,final,result);
	
	for(int i=1;i<=n;i++)
	{
		cout<<result[i]<<" ";
	}
	
	return 0;
 } 

在这里插入图片描述
自动排序的

#include<iostream>
#include<algorithm>
using namespace std;

typedef struct Node
{
	int starttime;
	int finaltime;
 }node;
 bool cmp(node a, node b)
 {
 	return (a.finaltime<b.finaltime);
 }
  
void activity_arrangement(int n,Node node[],bool result[])
{		//先按活动的结束时间排好序 
   
  
   sort(node+1,node+n+1,cmp);
   
	int temp;
	 result[1]=true;
	 temp=1;
	 for(int i=2;i<=n;i++)
	 {
	 	if(node[temp].finaltime<=node[i].starttime)
	 	{
	 		result[i]=true;
	 		temp=i;
		}
		else
		{
			result[i]=false;
		}
	 }
	 
}

int main()
{
	int n;
	cout<<"输入活动的个数:";
	cin>>n; 
	Node node[n+1];
	
	cout<<"输入活动的开始和结束的时间序列:"<<endl;
	for(int i=1;i<=n;i++)
	{
	cin>>node[i].starttime>>node[i].finaltime;
	}
	cout<<"活动的开始和结束的时间序列:"<<endl;
	for(int i=1;i<=n;i++)
	{
	cout<<"["<<i<<"]:"<<"("<<node[i].starttime<<","<<node[i].finaltime<<")"<<endl;
	}
	
	bool result[n+1];
	
	activity_arrangement(n,node,result);
	cout<<"安排的活动为:"<<endl; 
	int num=0;
	for(int i=1;i<=n;i++)
	{
		
		if(result[i]==1)
		{	
		num++;
		cout<<"["<<i<<"]:"<<"("<<node[i].starttime<<","<<node[i].finaltime<<")"<<endl;		
		}						
	}
	cout<<"可以安排的活动个数为:"<<num<<endl;
	
	return 0;
 } 


在这里插入图片描述
在这里插入图片描述

算法分析与设计 —— 贪心算法「活动安排」「背包问题」「哈夫曼编码」 文章内容简介 > 贪心算法基本要素:贪心选择性和最优子结构 > 贪心算法正确性证明 > 活动安排问题、背包问题、哈夫曼编码 阅读详情

相关推荐

算法设计与分析【第七周】贪心算法 活动安排问题

活动安排问题 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。 问题 如何安排任务,...

寒泉 1万+

贪心算法之活动安排问题(填表详解+思路解析)

贪心算法 总是选择当前看起来最优的选择(局部最优解),得到的结果是一个整体最优解。 但是总是选择局部最优解并不总是能得到整体最优解,需要在问题具有:贪心选择性和优化子结构时才成立。 贪心选择性:第一次做出贪心选择是正确的; 优化子结构:第一次做完贪心选择后,得到一个与原问题定义相同(但输入不同)的子问题; 贪心算法的基本要素 贪心选择性质 1.贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。 2.贪心

weixin_44952817的博客 1万+

JAVA代码—算法基础:贪心算法在活动安排问题中的应用

贪心算法在活动安排问题中的应用 问题描述 有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个活动场地可以利用,活动之间不能交叠,求最多安排多少个活动? 问题分析 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 4913

【算法设计与分析】活动安排问题(动态规划和贪心算法)

活动选择问题描述 假设我们存在这样一个活动集合S={a1,a2,a3,a4,...,an},其中每一个活动ai都有一个开始时间si和结束时间fi保证(0≤si<fi),fi保证(0≤si<fi),活动aiai进行时,那么它占用的时间为[si,fi)[si,fi).现在这些活动占用一个共同的资源,就是这些活动会在某一时间段里面进行安排,如果两个活动aiai和ajaj的占用时间[si,f...

one or only的博客 7326

Huber损失函数中的阈值δ是如何确定的?

Huber损失函数通过阈值δ将误差划分为两部分:当误差小于等于δ时,采用平方损失(MSE),以保持对小误差的敏感性;当误差大于δ时,采用线性损失(MAE),以降低异常值对模型的影响。

百态·数智思维 | 聚焦大数据、量化与未来AI 1929

手把手教你为ArduPilot添加自定义飞行模式:以自动巡检航线为例

本文详细介绍了如何为开源飞控ArduPilot添加自定义飞行模式,并以自动巡检航线为例,提供了从状态机设计、代码实现到地面站集成的完整开发指南。通过七步法手把手教学,帮助开发者深入理解飞控核心逻辑,实现无人机自主执行复杂巡检任务,满足行业应用定制需求。

weixin_29306875的博客 135

【贪心算法】活动选择问题——算法设计与分析

介绍了活动选择问题,给出了贪心策略求解的方案。并总结了贪心算法的特点、适用条件、正确性证明的一般思路。

友人帐_的博客 3208

STM32CubeMX+FreeRTOS+CAN总线+传感器实战:多任务系统与通信融合开发详解

本文详细介绍了基于STM32CubeMX和FreeRTOS的CAN总线与光电传感器融合开发实战。通过多任务系统设计,实现传感器数据采集与CAN通信的协同工作,提供完整的配置例程和调试技巧,适用于工业控制与机器人感知等应用场景。

n2o3p4的博客 734

【算法设计与分析】活动安排问题(贪心经典问题)

说明:本博客主要代码及方法介绍来源于:【算法设计与分析(第5版)】【王晓东】 一、题目背景介绍 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。 每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi 。 如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。 活动i...

○( ^皿^)っHiahiahia…的博客 4870

柔性OLED屏幕绿线故障的激光修复技术解析

OLED显示技术作为新一代显示方案,其主动矩阵驱动原理通过TFT背板控制每个像素的发光。在柔性屏幕应用中,微米级数据线路的物理损伤会导致显示异常,表现为贯穿屏幕的绿线故障。激光微焊技术凭借其微米级加工精度,成为修复这类精密电路损伤的理想方案。该技术通过纳秒级脉冲激光实现金属线路的精准重熔,在手机维修、显示面板制造等领域具有重要应用价值。特别是在折叠屏、曲面屏等柔性显示设备维修中,激光修复技术能有效解决因反复弯折导致的数据线断裂问题,配合光学定位系统和参数优化,修复成功率可达85%以上。

weixin_29168153的博客 324

STM32F407硬件SPI驱动ADS1220避坑指南:从寄存器读不到数据到采样值异常的完整解决流程

本文详细解析了STM32F407硬件SPI驱动ADS1220的常见问题与解决方案,包括SPI配置、寄存器读取异常、采样值优化等关键环节。通过CubeMX配置技巧和Keil调试经验,帮助开发者快速排查从通信失败到数据异常的各种问题,实现高精度数据采集系统的稳定运行。

weixin_26878995的博客 157

【算法设计与分析】— —实现活动安排问题的贪心算法。

【算法设计与分析】— —实现活动安排问题的贪心算法。

shsjssnn的博客 561

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 171

算法设计与分析贪心算法之活动安排问题

活动安排问题 问题描述 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。 每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi。如果选择了活动i,则它在半开时间区间[si ,fi )内占用资源。若区间[si ,fi )与区间[sj,fj )不相交,则称活动i与活动j是相容的。当 si ≥ f...

Air_Penguin5291的博客 577

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

1.新建shp文件地理坐标系保持和影像一致,面类型2.打开属性表3.添加字段这里分类6类,点击添加值添加添加完毕开始人工选地物类型,制作数据集开始标注,标注的时候可以借助谷歌地图来看标记足够多的样本打开面转栅格工具设置nodata值为15。

热爱分享,热爱记录 2524

Google Earth Engine 实现图像随机森林分类_遥感分类全流程详解

本文将通过一段完整的GEE代码,逐步讲解如何利用Sentinel-2影像和随机森林算法,实现地表覆盖分类。代码包含等关键步骤,适合遥感入门学习!

国科大硕士在读,分享Python/GEE/Matlab/R专业代码实践,涵盖数据分析、算法开发与应用技巧等,以代码会友。 916

计算机算法分析与设计(11)---贪心算法(活动安排问题和背包问题)

1. 贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。2.注意:贪心算法对有些问题可以快速获得整体最优解。对有些问题虽不能得到整体最优解,却可以得到近似最优解。贪心选择性质:贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择来得到,即通过贪心选择来达到。最优子结构性质:一个问题的最优解包含其子问题的最优解。相同:贪心算法和动态规划算法都要求问题具有最优子结构性质。

m0_62881487的博客 7643

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【活动安排问题】“贪心算法”——《算法设计与分析(第五版)》

【活动安排问题】“贪心算法”——《算法设计与分析(第五版)》

NI‘CE’XIAN‘s blog 1728

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)

假定一个有n个活动(activity)的集合S={a 1 ,a 2,....,a n},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动a i都有一个开始时间s i和一个结束时间f i,其中0<=s i<f i<=32767。如果被选中,任务a i 发生在半开时间区间[s i ,f i )期间。如果两个活动a i和a j满足[s i ,f i )和[s j ,f j )不重叠,则称它们是兼容的。

B5201234的博客 1052

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

算法分析与设计——贪心算法活动安排问题c++

#include <iostream> using namespace std; int s[]={0,1,3,0,5,3,5,6,8,8,2,12},f[]={0,4,5,6,7,8,9,10,11,12,13,14}; bool a[11]; int n=11; int Selector() { a[1]=true; int j=1; int count=1; for(int i=2;i<=n;i++){ if(s[i]>=f[j]){ a[i]=true;

晚安Alice 276

算法分析与设计-13-活动安排问题的贪心算法

活动安排问题的贪心算法 #include #include using namespacestd; struct action{ int s; int f; int index; }; bool cmp(constaction &a,const action &b) { if(a.f<=b.f)return t

高行行 645

算法设计与分析--活动安排问题(贪心算法)

public class GreedySeletor { public static int greedySelector(int []s,int []f,boolean []a) { int n=s.length-1 ; a[1]=true; int j=1; int count=1; for(int i=2;i<=n;i++) { if(s[i]>=f[j]) { a[i]=true; j=i; .

weixin_59337031的博客 306

活动安排问题(贪心算法C++)(计算机算法设计与分析 王晓东著 第5版)

活动安排问题 问题描述 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有要求使用该资源的起始时间si和结束时间fi,且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[si,fi)与区间[sj,fj)不相交,则称活动i和活动j是相容的。也就是说,当 si≥fjs_i \geq f_jsi​≥fj​ 或 sj≥fis_j \geq f_isj​≥fi​ 时,活动i与活动j相容。

Corey11的博客 1774

贪心算法☞活动安排

------------------------------------------------------------Sun--------------------------------------------------------------------------- 书:计算机算法设计与分析      1.原理:在对问题求解时,总是做出在当前看来是最好的选择。也就

留给互联网世界的一些字节 1169

算法设计与分析——活动安排问题——C语言

贪心策略:根据给的活动开始时间和结束时间,活动安排至少有三种看似合理的贪心策略可 供选择。 (1)每次从剩下未安排的活动中选择具有最早开始时间且不会与已安排的活动重叠的活动来安排,这样可以增大资源的利用率。 (2)每次从剩下未安排的活动中选择使用时间最短且不会与已安排的活动重叠的活动来安排。 (3)每次从剩下未安排的活动中选择最早结束时间且不会与已安排的活动重叠活动来安排。

田航语 1万+

算法设计与分析(电子科技大学)(上)算法基础和贪心算法

算法分析与设计 引论 (1)理解算法和程序的差别 (2)理解判断问题和优化问题这两类计算问题 1、理解指数增长的规模 2、理解渐进表达式 掌握渐进符号Ο、Θ、Ω的含义,能判断一个函数属于哪个渐近增长阶; 3、理解贪心算法的思想 掌握工作安排问题(Interval scheduling)的贪心算法;能对简单贪心算法进行证明; 4、理解分治算法的思想 掌握Master method(主方法)来求解递归关系式 5、理解动态规划算法的思想 对动态规划类型的问题能建立起基本的递归关系式,并能用从底至上的方法求解,在求

lyly1995的博客 4460
上一篇: 算法设计与分析——动态规划——01背包问题
下一篇: c语言——刷新控制台界面与返回上一级
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值