今年暑假不AC——HDU2037

今年暑假不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 
#include 

/*
	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;
}

你可能感兴趣的:(算法,#贪心算法)