贪心算法:活动安排问题

问题描述:
现在给你一个会场,有许社团需要在这个会场上活动,
已知各个社团在这个会场上活动的时间(起始时间和终止时间)
要求出来怎么安排
能够使得这个教室z在这一天之内接待尽可能多的社团

  •  解题思路与算法思想

     已经知道我们有n个活动需要安排
     	不妨考虑我们需要首先安排哪个活动
              如果这n个活动的开始时间分别为a1-an
     		  结束时间分别为b1-bn
     			那么对于我们要安排的第一个活动而言(假设这个活动是第i个)
     				无论他的开始时间是多少
     				**他占用的时间都是bi**
     这是由于虽然她只占用了ai-bi的时间
     	但是其实第一个活动,那么从0 - ai时间段里注定没有活动
     在选取好了第一个活动之后 		
     	我们需要选取第二个活动 
     	那么通过将和第一次活动重合的全部活动去掉的方式
    

    我们可以将这个问题转化成选取第一个活动的问题

  • 程序模型的建

  • 那么可以通过各个社团的结束时间对各个社团进行排序

  • 使得结束时间最早的以一些社团位于最前面
    -利用贪心的思想

    				每一都选取结束时间最靠前的哪一个
    				同时去除其他与这个被选择社团时间冲突的社团
    				再进行下一次比较
    
  • 数据结构的选用

  •  利用数组去储存各个社团的开始和终止时间
    
  •  程序设计流程

  •  输入数据
    
  •  进行排序
    
  •  得到结果
    
  • 程序设计伪码算法

     get things stored in a 
     sort a
     while(i<a,size()) 
     {
     	if(现在第第一位的开始时间等于大于上一个被选中社团的终止时间)
     	{
     		计数器+1 ;
     	}
     	i++ ;
     }
    

 源程序编码清单

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

bool comp(pair<int ,int >a ,pair<int ,int>b) ;

int main(void)
{
	vector< pair<int, int> > b ;
	int n  ;
	scanf("%d",&n) ;
	b.resize(n) ; 
	for(int i = 0 ;i<n ;i++)
	{
		int tem  ;
		scanf("%d",&tem) ;
		b[i].first = tem ;
		scanf("%d",&tem) ;
		b[i].second = tem ;
	}
	
	sort(b.begin(),b.end(),comp) ;
	int end ;
	end =b[0].second;
	
	int cnt = 1 ;
	
	for(int i = 0 ;i<b.size() ;i++)
	{
		if(b[i].first >= end)
		{
			end = b[i].second ;
			cnt++ ;
		}
	}
	
	
	printf("%d ",cnt) ;
	
	return 0 ;
	
	
	
	
	
}

bool comp(pair<int ,int >a ,pair<int ,int>b)
{
	if(a.second<b.second)
	{
		return true ;
	}
	else
	{
		return false ;
	}
}

 
  •  程序输入、输出

    扫描二维码关注公众号,回复: 3708096 查看本文章
     输入:
     		5
     		1 2 3 4 5 6 7 8 9 10
     输出:5
    

输入输出文件或程序运行结果截图

  • 时间与空间复杂度分析

     时间复杂度:
     	nlogn+n
    

 程序使用说明
 总结与完善

猜你喜欢

转载自blog.csdn.net/weixin_42222917/article/details/83189555