问题描述
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个贪心算法进行安排。
算法设计
对于K个待安排的活动,计算使用最少会场的时间表。
输入输出
input.txt
5
1 23
12 28
25 35
27 80
36 50
output.txt
3
分析解答
这个算法可以用GreedySelector来安排会场。最坏情况下算法需要O(n^2)计算时间。
实际上可以设计出一个更有效的算法。
将n个活动看作是实直线上的n个半闭活动区间[s[i],f[i]],实际上求这n个半闭区间的最大重叠数。重叠的活动区间相应的活动是互不相容的额,这样,求得的m个重叠区间,得到,至少要安排m个会场来容纳m个活动。
#include <iostream>
#include <vector>//标准库 容器
#include <algorithm>//调用sort函数
using std::vector;
using namespace std;
struct point
{
int t;
bool f;
};
bool cmp(point x,point y)
{
return x.t<y.t;//升序排列,如果改为return x.t>y.t,则为降序
}
int greedy(vector<point> x)
{
int sum=0,cur=0,n=x.size();
sort(x.begin(),x.end(),cmp);
for(int i=0;i<n;i++)
{
if(x[i].f)
cur++;
else
cur--;
if(cur>sum)
sum=cur;
}
return sum;
}
int main()
{
vector<point> x;
int n,i;
point temp;
while(cin>>n,n)
{
for(i=0;i<n;i++)
{
temp.f=true;
cin>>temp.t;
x.push_back(temp);
temp.f=false;
cin>>temp.t;
x.push_back(temp);
}
cout<<greedy(x)<<endl;
x.clear();
}
return 0;
}