问题描述:
现在给你一个会场,有许社团需要在这个会场上活动,
已知各个社团在这个会场上活动的时间(起始时间和终止时间)
要求出来怎么安排
能够使得这个教室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 ;
}
}
-
程序输入、输出
输入: 5 1 2 3 4 5 6 7 8 9 10 输出:5
输入输出文件或程序运行结果截图
-
时间与空间复杂度分析
时间复杂度: nlogn+n
程序使用说明
总结与完善