今年暑假不AC
有很多电视节目,给出它们的起止时间,有的节目时间冲突,问能完整看完节目最多有多少?
Input:输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output:对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
样例输入:
12
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
首先,从这题中我们可以看出,需要我们求出最多能看多少电视节目,这种求最多或最少的题目用贪心算法是最适合的了,那么我们要怎么贪这看的节目数量呢?当然就是尽可能找时间短的来看,或者尽可能节目一结束我们就可以看另一个,这时候呢,我选择了第二种思路
对于要直接看另一个节目,我们需要将节目的结束时间排好序,当一个节目结束时,我们只需要找在结束时间之后开始的第一个节目,就可以一直看下去,只需要将看了多少个节目统计下来即可
所以,我们需要做的就是对数据排序,然后根据顺序查找可行的时间段
代码如下:
#include <stdio.h>
#include <stdlib.h>
/*
order by end time
//integer up sort function in qsort
int inc (const void * a,const void *b)
{
return *(int *)a - *(int *)b;
}
*/
struct Time
{
int Ti_s;
int Ti_e;
};
int inc (const void * a,const void *b)
{
return (*(struct Time*)a).Ti_e - (*(struct Time*)b).Ti_e;
}
int main()
{
int i,n,sum,end_time;
while(scanf("%d",&n)&&n)
{
Time time[n];
for(i = 0;i<n;i++)
scanf("%d%d",&time[i].Ti_s,&time[i].Ti_e);
qsort(time,n,sizeof(time[0]),inc);
sum = 0;
end_time = 0;
for(i = 0;i<n;i++)
{
/*sorted by end time, if the next start time is after last time,add it*/
if(time[i].Ti_s >= end_time)
{
end_time = time[i].Ti_e;
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}