51Nod 1428 活动安排问题

51Nod   1428  活动安排问题

Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=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

题解:

简单的题目, 排序之后, 放进优先队列中,进行模拟,解决!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn =  100000 + 5; 

struct Node{
	int r, l;
}nd[maxn];
int n; 

int cmp(const void *a, const void *b){
	Node *aa = (Node *)a;
	Node *bb = (Node *)b;
	return aa->l - bb->l;
}

int main(){
///	freopen("in.txt", "r", stdin); 

	int x, y, p, ans, cur;
	while(scanf("%d", &n) != EOF){
		for(int i=0; i<n; ++i){
			scanf("%d %d", &nd[i].l, &nd[i].r);
		}
		qsort(nd, n, sizeof(nd[0]), cmp); 

		ans = 1;
		priority_queue<int, vector<int>, greater<int>> qt;
		qt.push(nd[0].r);
		for(int i=1; i<n; ++i){
			if(!qt.empty()){
				cur = qt.top();
				if(nd[i].l >= cur){
					qt.pop();
				}else{
					++ans;
				}
				qt.push(nd[i].r);
			}else{
				qt.push(nd[i].r);
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

  

时间: 2024-10-05 04:41:22

51Nod 1428 活动安排问题的相关文章

51nod 1428 活动安排问题(优先队列)

1428 活动安排问题 首先按照开始时间从小到大排序. 其实只要维护一个结束时间的最小堆,每次比较开始时间和堆中最小时间的大小,如果比它大就放入堆中并且时间就要变成当前任务的结束时间, 否则就要新开一个教室.并且把结束时间加入堆中,注意判断堆是否为空. #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; struct p

51nod1428 活动安排问题 (贪心加暴力)

1428 活动安排问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input 第一行一个正整数n (n <= 10000)代表活动的个数. 第二行到第(n + 1)行包含n个开始时间和结束时间. 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000 Output 一行包含一个整数表示最少教室的

NOJ 1163 活动安排问题 [动态规划]

活动安排问题 时间限制(普通/Java) : 3000 MS/ 9000 MS 运行内存限制 : 65536 KByte总提交 : 202            测试通过 : 55 比赛描述 设有n个活动的集合E={1,2,--,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi.如果选择了活动i,则它在时间区间[si,fi]内占用资源.若区间[si,fi]与区间[sj,fj

贪心算法_活动安排问题_哈弗曼编码

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源.若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的.也就是说,当si >= fj或sj >= fi时,活动i与活动j相容. 由于输入的活动以其完成时间的非减序排列,所以算法

活动安排问题python实现

活动安排问题要求高效地安排一系列争用某一公共资源的活动,贪心算法提供了一个简单的方法,使尽可能多的活动能兼容地使用公共资源.贪心算法并不总能求得问题的整体最优解,但对于活动安排问题,贪心算法却能做到,使得最终所确定的相容活动集合的规模最大,证明不在这里给出.代码如下: def greedyManage(meeting): length=len(meeting) meeting.sort(key=lambda x:x[1]) result=[False for i in range(length)

hdu2037-----------贪心, 活动安排问题

http://acm.hdu.edu.cn/showproblem.php?pid=2037(简单贪心-----活动安排) #include<iostream> #include<algorithm> using namespace std; struct Node { int l, r; }a[105]; bool Cmp(Node x, Node y) { if(x.r!=y.r) return x.r<y.r; else return x.l>y.r; } int

贪心算法-----单线程:活动安排问题 多线程:多机调度问题

一.贪心算法的特点 顾名思义,贪心算法总是做出在当前看来是最好的选择.虽然贪心算法并不从整体最优上加以考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的优点是更简单,更直接且解题效率更高,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解. 二.贪心算法的理解 由于涉及到在做出在当前看来最好的选择,所以会经常采用排序算法,推荐使用快速排序算法,复杂度是O(nlgn),且在同等复杂度算法中效率是最高的, 本文涉及的排序都采用冒泡排序,只是注明需要排序而已. 贪心算法

忙碌的Nova君 (活动安排问题、贪心算法)

题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设现在有N项工作等待Nova君完成,分别在 Si 时刻开始,在 Ti 时刻结束,对于每项工作可以选择做或者不做,但不可以同时选择时间重叠的工作(即使是开始的瞬间和结束的瞬间重叠也是不允许的).Nova君自然希望尽量多做一些事情,那么最多能做几件事呢? 输入 多组测试数据(数据组数不超过10),对于每组

【算法导论实验5】贪心-活动安排问题与背包问题

首先是活动安排问题. 贪心的关键在于排序策略. 思路很简单,对所有活动的结束时间排序,如果结束时间相同,因为要尽量多的参加活动,所以选取开始时间尽量晚的(这样可以安排的比较多),然后依次从早到晚选取不冲突的活动加入,即为最多可以参加的活动. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <fstream> using n