思路:
按照每个区间[a, b]中的a来从小到大排序。
第一次,计算开头落在 [0, 0] 之间的区间[a, b]中,b的最大值 b1。
第二次,计算开头落在 [0, b1 + 1] 之间的区间[a, b]中,b的最大值 b2。
第三次,计算开头落在 [b1 + 1, b2 + 1] 之间的区间 [a, b] 中,b的最大值 b3。
。。。
#include <stdio.h>
#include <stdlib.h>
struct node {
int start, end;
};
struct node arr[25032];
int N, T;
int cmp(const void *a, const void *b)
{
return ((struct node *)a)->start - ((struct node *)b)->start;
}
int main()
{
int i, max_val, cnt, end;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d%d", &N, &T);
for (i = 0; i < N; i++)
scanf("%d%d", &arr[i].start, &arr[i].end);
qsort(arr, N, sizeof(arr[0]), cmp);
i = cnt = 0;
end = 1;
while (end <= T) {
max_val = 0;
while (i < N && arr[i].start <= end) {
if (arr[i].end > max_val)
max_val = arr[i].end;
i++;
}
if (!max_val)
break;
end = max_val + 1;
cnt++;
}
printf("%d\n", end == T + 1 ? cnt : -1);
}