HDU2037 事件排序问题

题目要求:

Problem Description
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”

确实如此,世界杯来了,球迷的节日也来了。预计非常多ACMer也会抛开电脑。奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其他的节目,比方新闻联播(永远不要忘记关心国家大事)、很6+7、超级女生,以及王小丫的《开心辞典》等等,如果你已经知道了全部你喜欢看的电视节目的转播时间表。你会合理安排吗?(目标是能看尽量多的完整节目)
 

Input
输入数据包括多个測试实例,每一个測试实例的第一行仅仅有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的開始和结束时间,为了简化问题,每一个时间都用一个正整数表示。n=0表示输入结束,不做处理。
 

Output
对于每一个測试实例。输出能完整看到的电视节目的个数。每一个測试实例的输出占一行。

解题思路:

        看到这道题目之后。非常easy知道这是一个关于事件的排序问题。用start[i]和end[i来记录每一个事件i的開始和结束的时间。为了在之后对事件的结束时间的早晚进行排序。考虑用结构体来存储事件的起止时间,然后按事件的结束的早晚进行排序。贪心算法,让选择了一个事件之后,剩余的时间尽可能的大。因此优先选择结束时间早的事件。在对事件的结束时间按从早到晚的顺序拍好序后,就能够依照从前到后的考虑,增加了一个事件后。考虑下一个时间的開始时间是否大于(包括等于)当前事件的结束时间,假设是则增加到序列。


实现的代码:

# include <iostream>
# include <algorithm>
using namespace std;

struct node
{
	int start;
	int end;
}Node[105];

int cmp(struct node a,struct node b)
{
	return a.end<b.end;
	return a.start<b.start;
}

int main()
{
	//freopen("input.txt","r",stdin);
	int n;
	while((scanf("%d",&n))!=EOF && n!=0)
	{
		int i,j;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&Node[i].start,&Node[i].end);
		}
		sort(Node,Node+n,cmp);
		int maxs=1;
		int cur=0;
		for(i=1;i<n;i++)
		{
			if(Node[i].start>=Node[cur].end)
			{
				maxs++;
				cur=i;
			}
		}
		printf("%d
",maxs);
	}
	return 0;
}


原文地址:https://www.cnblogs.com/wzzkaifa/p/7097260.html