[贪心] 51nod 1428 活动安排问题

 

1428 活动安排问题 

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题

 收藏

 关注

有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 

Input

第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000

Output

一行包含一个整数表示最少教室的个数。

Input示例

3
1 2
3 4
2 9

Output示例

2

 

经典的贪心算法

 

结构体存储数据

按开始 结束 升序 排序

往房间数组中塞

房间数组中只存结束时间

塞数规则:

如果当前活动 i 的 开始时间 大于 房间数组 中的 结束时间

就用 当前活动 i 的 结束时间 替换掉 房间数组 中的 结束时间

如果所有 房间数组 中的 结束时间 都比 活动 i 中的 开始时间 大

那么再开一个房间 结束时间 赋值为当前活动 i 的结束时间;

#include <iostream>
#include <algorithm>
using namespace std;
int clas[10000] = {0};//房间数组
struct active
{
	int beg;
	int end;
}arr[11000];
bool cmp(active x, active y)
{
	if(x.beg != y.beg)
		return x.beg < y.beg;
	else
		return x.end < y.end;
}
int main()
{
	ios::sync_with_stdio(false);
	int n, flag = 1;
	cin>>n;
	for(int i = 0; i < n; i++)
	{
		cin>>arr[i].beg>>arr[i].end;
	}
	sort(arr, arr + n, cmp);
	/*for(int i = 0; i < n; i++)
	{
		cout<<arr[i].beg<<' '<<arr[i].end<<endl;
	}*/
	for(int i = 0; i < n; i++)
	{
		int j;
		for(j = 0; j < flag; j++)
		{
			if(arr[i].beg >= clas[j])
			{
				clas[j] = arr[i].end;
				break;
			}
		}
		if(j == flag)
		{
			clas[flag ++] = arr[i].end;
		}
	}
	cout<<flag<<endl;
	return 0;
}

 

 

 

 

 

posted @ 2018-05-06 14:41  张浦  阅读(83)  评论(0)    收藏  举报