问题描述:
学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入:
第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
输出:
对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行
注意:
如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始
思路:
先将这些活动按照结束时间来进行排序。
则,结束时间最早的一定是符合要求的序列的第一个,第二个活动的选择就相当于剩下的开始时间晚于第一个结束时间的活动的集合中再选择第一个。
用Java实现的代码如下:
public class Meet implements Comparable{
private int begin;
private int end;
public Meet(int b,int e){
begin = b;
end = e;
}
public int getBegin(){
return begin;
}
public int getEnd(){
return end;
}
public int compareTo(Object o) {
// TODO Auto-generated method stub
Meet m = (Meet)o;
if(this.end>m.getEnd())
return 1;
else if(this.end == m.getEnd())
return 0;
else
return -1;
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int groups = in.nextInt();
int[] results = new int[groups];
for(int i = 0;i<groups;i++){
int length = in.nextInt();
ArrayList<Meet> list = new ArrayList<>();
for(int j = 0;j<length;j++){
int b = in.nextInt();
int e = in.nextInt();
Meet meet = new Meet(b,e);
list.add(meet);
}
Collections.sort(list);
int num = 1;
int now = list.get(0).getEnd();
for(int j = 0;j<length;j++){
Meet e = list.get(j);
if(e.getBegin()<=now)
continue;
else{
now = e.getEnd();
num++;
}
}
results[i] = num;
}
for(int i = 0;i<groups;i++)
System.out.println(results[i]);
}
}
运行结果如下图所示: