nyoj 14 会场安排问题
2016-04-28 19:25
239 查看
会场安排问题
[align=center]时间限制:3000 ms | 内存限制:65535 KB[/align]描述
[align=left]学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
[/align]
[align=left][/align]
[align=left]输入[/align]
第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
[align=left]输出[/align]
对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行
[align=left][/align]
样例输入
2 2 1 10 10 11 3 1 10 10 11 11 20
样例输出
1 2
思路:先对每组结束时间进行排序,如果两个时间重合的话,就最多只参加一场,能既然需要输出能够参加最多的活动,那就使开始时间大于上一组的结束时间,这就说明两组活动时间不会重合,如果满足这个条件就可以计数一次。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; struct time //定义结构体 { int begin; //开始时间 int end; //结束时间 } act[10001]; bool cmp(const time a,const time b) { return a.end<b.end; } int arr(int n) { int i; sort(act,act+n,cmp); //从小到大对end排序 int count=0; int curr=-1; for(i=0; i<n; i++) { if(act[i].begin>curr) //如果开始时间大于上一个结束时间说明这两个时间之间有时间空余 { count++; // 计数 curr=act[i].end; } } return count; } int main() { int m; scanf("%d",&m); while(m--) { memset(act,0,sizeof(act)); int i,n; scanf("%d",&n); for(i=0; i<n; i++) scanf("%d%d",&act[i].begin,&act[i].end); //输入 printf("%d\n",arr(n)); } return 0; }
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- HDU 1009 Fatmouse's Trade
- POJ2377 Bad Cowtractors
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻