hdu 2037 今年暑假不AC

题解:贪心法 选择不相交区间

  先将所有的电视节目按照结束时间的早晚排序,排好序后,第一个节目是必须选的,因为他结束时间最早,最不可能与其他节目重叠。将该节目和与它重叠的节目删除(这样写是为了好理解,写程序是可以不删除),那么剩下的节目的第一个节目就成了必选节目,再删除,再选......一直到没有节目为止,就可得到正解。

   代码如下:

#include <cstdio>
#include <algorithm>

typedef struct TV
{
	int Ti_s, Ti_e;
	bool operator <(const TV & x)const
	{//为了使sort函数是按照节目的结束时间排序的
		return Ti_e < x.Ti_e;
	}
}tv[101];

int main()
{
	int n, i, cur, cnt;
	tv A;//定义节目数组
	while (scanf("%d", &n) && n)
	{
		cur = 0;
		cnt = 1;
		for (i=0; i<n; i++)
			scanf("%d%d", &A[i].Ti_s, &A[i].Ti_e);
		std::sort(A, A+i);
		for (i=1; i<n; i++)
		{
			if (A[cur].Ti_e <= A[i].Ti_s)
			{//若当前节目的结束时间与第i个节目不重叠
				cur = i;//第i个节目看做当前第一个节目,相当于删除了以前的节目
				cnt++;//完整节目计数
			}
		}
		printf("%d\n", cnt);
	}
	return 0;
}


 

posted on 2013-01-19 21:15  zm001  阅读(143)  评论(0编辑  收藏  举报