51nod 1428 (贪心+优先队列)
2016-04-08 11:23
381 查看
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
Input
Output
思路:发现好多贪心的题目都是用优先队列来解决的。。。。
着个题目实际上就是求很多区间当中最大的重叠部分的区间个数。就是因为想到这里以为是直接贪心,想了好久发现并没有什么好的方法去实现。然后看了一下之前写的贪心题目就想到了优先队列。 按照结束时间最小值优先的策略就可以很轻松的解决这个题目。
Input
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
思路:发现好多贪心的题目都是用优先队列来解决的。。。。
着个题目实际上就是求很多区间当中最大的重叠部分的区间个数。就是因为想到这里以为是直接贪心,想了好久发现并没有什么好的方法去实现。然后看了一下之前写的贪心题目就想到了优先队列。 按照结束时间最小值优先的策略就可以很轻松的解决这个题目。
#include <iostream> #include <cstdio> #include <queue> #include <stack> #include <cstring> #include <algorithm> using namespace std; #define inf 1000000005 #define LL long long int const maxn = 10005; struct node { LL s,e;//结束时间和奖励 bool operator < (const node& u)const { return e>u.e ; //最小值优先 } }A[maxn]; bool cmp(node a,node b) { if(a.s!=b.s)return a.s<b.s; return a.e<b.e; } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i = 0 ; i < n ; i++) { scanf("%I64d%I64d",&A[i].s,&A[i].e); } sort(A,A+n,cmp); int ans = 1 ; priority_queue<node> q; while(!q.empty())q.pop(); q.push(A[0]); for(int i = 1 ; i < n ; i++) { node temp = q.top(); q.pop(); if(A[i].s<temp.e) { ans++; q.push(A[i]); q.push(temp); } else q.push(A[i]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- iOS设置UILabel的行间距
- Java 设计模式 <工厂模式>
- mybatis中Date和DateTime字段的插入
- Android studio
- 当Spring同时使用了XML配置和注解
- 文章标题
- 使用dispatch_once写单例注意
- leetcode_087 Scramble String
- LeetCode(36)- Implement Stack using Queues
- LeetCode(36)- Implement Stack using Queues
- LeetCode(36)- Implement Stack using Queues
- Android中代码混淆和打包
- xml
- 搭建linux虚拟机
- C#开发微信门户及应用(29)--微信个性化菜单的实现
- hive 回避map-reduce job的场景
- SQL中的CASE的用法
- Linux下安装并(单节点)配置启动Kafka
- 但是这个谁也说不准的吧cc11
- NSInvocation