会场安排问题描述
== 会场安排问题描述 ==
学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。
小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,
他想尽可能的安排更多的活动,请问他该如何安排。
== 输入 ==
第一行是一个整型数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
分析
-
活动安排问题, 活动尽可能多,
-
一个活动有两个属性,开始时间结束时间,考虑用结构体进行排序(是不是谈贪也可以解决,应该有很多解决办法)
//结构体的表示方式 struct Time{ int bi,ei; }time[10010];
-
调用sort排序头文件algorithm
-
思路按照活动结束时间排序,从第一个活动开始排查,前一个活动的结束时间为当前活动可以的开始时间,判断下一个活动是否可以开始。因此需要有一个变量记录当前最早开始时间,还要一个变量记录最多的活动时间
-
问题一bool comp(Time &a,Time &b)错误,不写&,写了以后DevC++运行不出来,虽然codeblock可以运行出来。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct Time{ int bi,ei; }time[10010]; //Time是数组类型,time具体化 bool comp(Time a,Time b){ return a.ei<b.ei; } //自定义按照结束时间比较的函数 int main(){ int m,n; cin>>m; while(m--){ while(cin>>n&&n!=0){ int num=0,now=0; for(int i=0;i<n;i++){ scanf("%d%d",&time[i].bi,&time[i].ei); //scanf("d%",&time[i].bi); //scanf("%d",&time[i].ei); //我这里不知道为什么换成scanf就不对了 //cin>>time[i].bi>>time[i].ei; } sort(time,time+n,comp); for(int j=0;j<n;j++){ if(time[j].bi>=now){ num++; now=time[j].ei; } } cout<<num<<endl; } } return 0; }