NYOJ14——会场安排(贪心算法)

题目描述:学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入
第一行是一个整型数m(m<100)表示共有m组测试数据。每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
输出
对于每一组输入,输出最多能够安排的活动数量。每组的输出占一行
样例输入
2
2
1 10
10 11
3
1 10
10 11
11 20
样例输出:
1
2
提示
注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始
分析:其实就是求尽可能多的不相交的区间。将时间区间按照结束时间升序排列,如果结束时间相同,按开始时间降序排列。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

struct tu
{
	int s;//开始坐标
	int e;//结束坐标
}a[10000];

int compare(const void * a, const void * b);

int main()
{
	int n;
	int l;
	int i,t;
	int sum;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i = 0; i < n; ++i)
			scanf("%d %d",&a[i].s, &a[i].e);

		qsort(a,n,sizeof(a[0]),compare);

		i = 0;
		l = a[0].e;
		sum = 1;

		while(i < n)
		{
			while(a[i].s <= l && i < n)
				++i;

			if(i >= n)
				break;

			++sum;
			l = a[i].e;
		}
		printf("%d\n", sum);
	}
}

int compare(const void *a, const void *b)
{
	//按终点坐标升序排列,如果终点坐标相同,按起点坐标降序排列
	struct tu *p1 = (struct tu *)a;
	struct tu *p2 = (struct tu *)b;
	if(p1->e == p2->e)
		return p2->s - p1->s;
	else
		return p1->e - p2->e;
}

你可能感兴趣的:(ACM,贪心)