这就是个区间覆盖问题
前端点从小到大排序,后端点排不排都无所谓。
注意一点
p[i].b < p[i+1].a
这种情况是可以的 也就是说
p[i+1].a <= p[i].b+1;
而尾端点是
p[i+1].b > p[i].b;
用两个变量 代表当前区间,不断更新。
l , r
p[i].a <= l+1; l 代表上一个区间的最右端
p[i].b > r r = p[i].b;
// Cleaning Shifts.cpp: 定义控制台应用程序的入口点。 // //#include "stdafx.h" #include<cstdio> #include<algorithm> using namespace std; const int N = 25000; struct node { int a, b; }p[N + 10]; bool cmp(const node &a, const node &b) { //if (a.a == b.a) //return a.b > b.b; return a.a < b.a; } int main() { int n, t; scanf("%d%d", &n, &t); for (int i = 0; i < n; i++) scanf("%d%d", &p[i].a, &p[i].b); sort(p, p + n, cmp); int l, r, tot; tot = 1; l = 1; r = 0; for (int i = 0; i < n; i++) { if (p[i].a <= l && p[i].b > r) r = p[i].b; if (p[i].a > l && p[i].b > r) { l = r + 1; if (p[i].a <= l) { r = p[i].b; tot++; } else break; } } if (r >= t) printf("%d\n", tot); else printf("-1\n"); return 0; }