问题描述
安排好所有的活动,并占用最少的会场。
题目分析
这个问题和我们之前说过的活动安排很相似,但是我们这次要求的是利用最少的会场。如果所有活动都是相容的,使用一个会场就可以举办完。一个会场可以举办一些相容的活动,而不相容的活动只能通过新会场举办。
所以这个问题,我们很容易可以想到利用并查集来解决,判断两个活动是否相容(前一个活动的结束时间<=后一个活动的开始时间),如果相容,就将二者连入同一集合。最后有几个集合就有多少个会场。这种方法很简单,但我用了更普通的方法。
设立flag数组表示对应索引的活动是否已经被安排了,如果被安排了就跳过。
在迭代的过程中,设立一个end_Time,当找到了相容活动时,用后一个活动的finish来更新end_Time,这样就不能不断地在其中找到相容活动,被分配的活动要将flag置为1.
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int number;//活动数目
cin>>number;
vector<int>start;//活动开始数组
vector<int>finish;//活动结束数组
vector<int>flag;//标志活动是否被安排
int s,f;//开始时间和结束时间
for(int i = 0;i < number;i++)
{
cin>>s>>f;
start.push_back(s);
finish.push_back(f);
flag.push_back(0);//flag初始化为0
}
int count = 0;
for(int i = 0;i < number - 1;i++)
{
if(!flag[i])
flag[i] = 1;
else
continue;
int end_time = finish[i];
for(int j = i+1;j < number;j++)
{
if(!flag[j])
{
if(start[j] >= end_time)
{
flag[j] = 1;
end_time = finish[j];
}
}
}
count++;
}
cout<<count;
return 0;
}
总结
时间复杂度O(n^2)。
空间复杂度O(n)
并查集算法无论在时间或者空间复杂度都很优质,但是我只是打搭了一个并查集的框架,没有实现具体的与问题相关的内容,所以先不晒了,以后有机会晒出来。