/*
每一个面试是一个整数的闭区间[B[i],E[i]],表示开始时间和结束时间,有N个面试要进行,求最少的面试点
思路:
按开始时间排序,使用贪心策略,每一个面试用一个最小的正整数k来表示可行的颜色,当然如果重叠了就必须使用
一个新的颜色
输入:
4(N场见面会,接下来有N行,每一行表示节目的开始时间和结束时间)
1 5
2 3
3 4
3 6
输出:
3
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXSIZE = 1000;
typedef struct Meeting
{
bool operator < (const Meeting& meet) const
{
return _iBeg < meet._iBeg;
}
int _iBeg;
int _iEnd;
}Meeting;
//Meeting meet[MAXSIZE];
bool isOverlap(const Meeting& meet1,const Meeting& meet2)
{
if(meet1._iEnd <= meet2._iBeg || meet1._iBeg >= meet2._iEnd)//判断两个区间不重叠,只需一个区间的结束<=另一个区间的开始,或者一个区间的开始>=另一个区间的结束
{
return false;
}
else
{
return true;
}
}
int minAddress(Meeting* pMeet,int iLen)
{
int maxcolor = 0,k;
int color[MAXSIZE];
bool bForbidden[MAXSIZE];//bForbidden是每个时间区间i,其他时间区间j中开始时间位于这个时间之前的
//且与这个时间区间有重叠的面试所占用的颜色表示数组
memset(bForbidden,0,sizeof(bForbidden));//没整明白
for(int i = 0 ; i < iLen; i++)
{
for(k = 0 ; k < maxcolor ; k++)
{
bForbidden[k] = false;
}
for(int j = 0 ; j < i ; j++)
{
if(isOverlap(pMeet[j],pMeet[i]))//判断在时间区间i之前的其他时间区间是否与当前时间区间重叠
{
bForbidden[color[j]] = true;
}
}
for(k = 0 ; k < maxcolor ; k++)
{
if(!bForbidden[k])
{
break;
}
}
if(k < maxcolor)
{
color[i] = k;
}
else
{
color[i] = maxcolor++;
}
}
return maxcolor;
}
void process()
{
int n;
while(EOF != scanf("%d",&n))
{
if(n < 0 )
{
break;
}
Meeting meet[MAXSIZE];
for(int i = 0 ; i < n ; i++)
{
scanf("%d %d",&meet[i]._iBeg,&meet[i]._iEnd);
}
sort(meet,meet+n);
printf("%d\n",minAddress(meet,n));
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}