首先明确贪心策略,按L排序,每次选取符合条件的R最大的那个。
注意读题"A cow starts work at the start time and finishes after the end time. ".
熟悉区间枚举的方式。
注意读题"A cow starts work at the start time and finishes after the end time. ".
熟悉区间枚举的方式。
#ifdef _DEBUG
#pragma warning(disable : 4996)
#endif
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define CLOSE() ios::sync_with_stdio(false)
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define PF(a) printf("%d\n", a)
#define SF(a) scanf("%d", &a)
#define SFF(a, b) scanf("%d%d", &a, &b)
#define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define LL long long
#define maxn 25005
#define maxm 500005
#define MOD 1000000007
#define INF 1e18
using namespace std;
//-------------------------CHC------------------------------//
//POJ 2376 Cleaning Shifts
struct Node {
int l, r;
bool operator<(const Node &rhs) const {
return l < rhs.l;
}
}node[maxn];
int main() {
int n, t;
while (~SFF(n, t)) {
FOR(i, 0, n) SFF(node[i].l, node[i].r);
sort(node, node + n);
int cnt = 0;
if (node[0].l != 1) {
PF(-1);
continue;
}
int idx = 0, last = 0, maxr = 0;
while (idx < n) {
bool have = false;
while (idx < n && node[idx].l <= last + 1) {
maxr = max(maxr, node[idx].r);
have = true;
idx++;
}
if (!have) break;
last = maxr, cnt++;
if (maxr >= t) break;
}
if (last < t) PF(-1);
else PF(cnt);
}
return 0;
}