题目描述
寒假到了,小明回到家和爸妈打声招呼就奔向电视了,作为一个资深电视迷,一定想看尽量多的完整的电视节目,以弥补学校枯燥的学习生活。假设你已经知道了所有小明喜欢看的电视节目的转播时间表,请你帮助小明合理安排时间(目标是能看尽量多的完整节目)
输入
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
输出
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
样例输入
copy12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
样例输出
5
提示
可以使用系统函数 qsort
包含头文件#include <stdlib.h>
其中qsort的声明如下:
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
#include<bits/stdc++.h>
using namespace std;
///区间贪心问题
struct tvshow
{///定义结构体是一种常规想法
int x,y;///开始结束时间,即区间端点
}show[101];
bool cmp(tvshow a,tvshow b)
{///关键思想
if(a.x!=b.x)return a.x>b.x;///左端点按从大到小排序
else return a.y<b.y;///左端点相同,右端点从小到大排序
}
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=0; i<n; i++)
cin>>show[i].x>>show[i].y;///结构体输入
sort(show,show+n,cmp);
int sum=1,min=show[0].x;
for(int i=1; i<n; i++)
{///如果从第二个区间开始有右端点比前面区间的左端的要小
///肯定不相交!!!
if(show[i].y<=min)
{///就把该区间的左端作为最小值
min=show[i].x;
sum++;///恭喜你!!!找到一个区间啦!!!
}
}
cout<<sum<<endl;///找到不相交的总数
}
}
inline char gc()
{
static char buff[100000000], *S = buff, *T = buff;
return S == T && (T = (S = buff) + fread(buff, 1, 100000000, stdin), S == T) ? EOF : *S++;
}