活动安排问题(贪心算法)

问题描述:

有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺利进行,即也就是每个活动的活动时间都互相不交叉,求m的最大值和 被选中的活动序号。

例如输入:

活动编号   活动开始时间    活动结束时间

1                1                       4

2                3                       5

3                0                       6

4                5                       7

5                3                       8

6                5                       9

7                6                       10

8                8                       11

9                8                       12

10              2                       13

11              12                     14

本程序利用贪心算法解决,输出的答案是:

应该选择的活动编号为:

1      4        8        11(即最大可以安排这4个活动)

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

/*
*活动安排问题(贪心算法)
*/

struct Act
{
	int beg;//活动的开始时间
	int end;//活动的结束时间
	int index;//活动的编号
	friend ostream & operator<<(ostream &o,const Act &A);
	friend istream & operator>>(istream &o, Act &A);
};
ostream & operator<<(ostream &o,const Act &A)
{
	o<<A.beg<<"---"<<A.end<<" ";
	return o;
}

istream & operator>>(istream &o, Act &A)
{
	o>>A.index>>A.beg>>A.end;
	return o;
}

bool cmp(Act & act1,Act & act2)
{
	if(act1.end<act2.end)
	{
	  return true;
	}else
	{
		return false;
	}
}

vector<int> GreedySelector(vector<Act> & acts)
{
	//首先把活动按照活动的结束时间进行排序
	sort(acts.begin(),acts.end(),cmp);
	//在排序后的活动集合中选择可行的活动
	vector<int> res;
	res.push_back(acts[0].index);//首先选中第一个活动
	int now = 0;//当前选中的活动下标
	for (int i = 1; i < acts.size(); i++)
	{
		if(acts[i].beg>=acts[now].end)
		{
			now = i;
			res.push_back(acts[i].index);
		}
	}
	return res;
}

int main()
{
	vector<Act> acts;//可选活动集
	copy(istream_iterator<Act>(cin),istream_iterator<Act>(),back_inserter(acts));
	cout<<endl;
	vector<int> res_act;//得出的方案中的活动编号集
	res_act = GreedySelector(acts);
	//输出结果
	copy(res_act.begin(),res_act.end(),ostream_iterator<int>(cout,"  "));
	cout<<endl;
}

时间: 2024-08-06 13:03:21

活动安排问题(贪心算法)的相关文章

51nod1428 活动安排问题 (贪心加暴力)

1428 活动安排问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input 第一行一个正整数n (n <= 10000)代表活动的个数. 第二行到第(n + 1)行包含n个开始时间和结束时间. 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000 Output 一行包含一个整数表示最少教室的

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

贪心算法-活动安排问题

活动安排问题 问题描述 有n个需要使用同一资源的活动,且在同一时段只有一个活动能使用该资源. 每个活动i都有一个起始时间 si 和结束时间 fi ,且 si < ei .如果选择了活动 i,则它在半开时间区间 [si,ei) 内占用资源.若区间 [si, ei) 与区间 [sj,ej) 不相交,则称活动 i 与活动 j 是相容的. 该问题就是要安排这些活动使得尽量多的活动能不冲突地举行. 归纳: 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合. 解题思路 每次总是选择具有最早完成时

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

贪心算法_活动安排问题_哈弗曼编码

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源.若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的.也就是说,当si >= fj或sj >= fi时,活动i与活动j相容. 由于输入的活动以其完成时间的非减序排列,所以算法

贪心算法-----单线程:活动安排问题 多线程:多机调度问题

一.贪心算法的特点 顾名思义,贪心算法总是做出在当前看来是最好的选择.虽然贪心算法并不从整体最优上加以考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的优点是更简单,更直接且解题效率更高,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解. 二.贪心算法的理解 由于涉及到在做出在当前看来最好的选择,所以会经常采用排序算法,推荐使用快速排序算法,复杂度是O(nlgn),且在同等复杂度算法中效率是最高的, 本文涉及的排序都采用冒泡排序,只是注明需要排序而已. 贪心算法

【算法导论实验5】贪心-活动安排问题与背包问题

首先是活动安排问题. 贪心的关键在于排序策略. 思路很简单,对所有活动的结束时间排序,如果结束时间相同,因为要尽量多的参加活动,所以选取开始时间尽量晚的(这样可以安排的比较多),然后依次从早到晚选取不冲突的活动加入,即为最多可以参加的活动. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <fstream> using n

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

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

活动安排问题https://blog.csdn.net/qq_40452317/article/details/88875384 贪心算法汇总--喷水装置问题.会场安排问题.过河问题https://blog.csdn.net/liujiuxiaoshitou/article/details/69728714 原文地址:https://www.cnblogs.com/yasheng/p/12517250.html