1254: 活动安排
时间限制: 1 Sec 内存限制: 128 MB
提交: 1461 解决: 779
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
有n份兼职,每份兼职有一个开始时间和一个结束时间,假设你的空闲时间为从1到m,假如你的休息时间可以忽略,
请你选择若干份兼职(每次只能做其中一个兼职),使你在该段空闲时间内完成的兼职份数最大。
输入
第一行为两个整数n,m分别表示n份兼职,空闲时间为1到m(1<=n<=1e4,1<=m<=1e5)。
接下来n行每行有2个整数a,b。表示该兼职开始和结束时间(1<=a<=b<=m)。
输出
输出你在1到m时间段内最多能完成几份兼职。
样例输入 Copy
4 10 1 3 2 4 5 7 9 10
样例输出 Copy
3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static void main(String[] args) {
int n = nextInt();
int m = nextInt();
int[][] A = new int[n][2]; // A[i][0]代表活动i的开始时间,A[i][1]代表结束时间
for (int i = 0; i < n; i++) {
A[i][0] = nextInt();
A[i][1] = nextInt();
}
// 重写比较器,按照结束时间升序
Arrays.sort(A, new Comparator<int []>() {
public int compare(int[] a, int[] b) {
return a[1] - b[1];
}
});
int cnt = 1; // 活动数
int j = 0; // 当前活动的 下标
// 当下一个活动
for (int i = 1; i < n; i++) {
if (A[i][0] >= A[j][1]) {
cnt++;
j = i;
}
}
System.out.println(cnt);
}
static int nextInt() {
try {
in.nextToken();
} catch (IOException e) {
e.printStackTrace();
}
return (int)in.nval;
}
}