有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。
每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。
如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。
思路:
按结束时间将结构体数组从小到大排序,结束时间最早的作为第1个活动,将数组后起始时间前一个
活动结束时间大的作为下一个活动
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct st
{
int head;//起始时间
int tail;//结束时间
}arr[100]; //数组每个元素表示一个活动的起始 和结束时间
int js()
{
int i,j,cnt=1;//cnt为1,第一个活动就是一个活动,不用计算
for (j=1;j<n;j++)
{
if (arr[j].head > arr[j-1].tail)
cnt++;
}
return cnt;
}
bool cmp(const st &x,const st &y)
{
return x.tail < y.tail;
}
int main()
{
int i;
cin>>n;
for (i=0;i<n;i++)
{
cin>>arr[i].head>>arr[i].tail;
}
sort(arr,arr+n,cmp); //将结构体每组成员按结束时间tail来从小到大排序
for (i=0;i<n;i++)
{
cout<<arr[i].head<<" "<<arr[i].tail<<endl; //显示排序后的
}
cout<<"可以安排"<<js()<<"场活动";
return 0;
}