描述
数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
不可能办到输出-1
输入
第一行:N和T
第二行至N+1行: 每一行一个闭区间。
输出
选择的区间的数目,不可能办到输出-1
样例输入
3 10
1 7
3 6
6 10
样例输出
2
提示
这道题输入数据很多,请用scanf而不是cin
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
#include<stdio.h>
using namespace std;
struct line {
int pa;
int pb;
line(int s, int e) :pa(s), pb(e) {
}
bool operator<(const line& l2) {
if (pa != l2.pa) {
return pa < l2.pa;
}
return pb > l2.pb;
}
};
int main(int argc, char** argv) {
list<line> lines;
int n, t;
cin >> n >> t;
for (int i = 0; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
if (b < a) swap(a, b);
if (a > t)continue;
line newline(a, b);
lines.push_back(newline);
}
lines.sort();
int cmin = 0, cmax = 0, nmin = 0, nmax = 0, ca = 0, cb = 0, point = 0;
for (list<line>::iterator it = lines.begin(); it != lines.end(); it++) {
ca = it->pa; cb = it->pb;
if (ca > cmin) { //skip to next line
if (ca > cmax + 1) { //no result
cout << -1 << endl;
return 0;
}
cmin = cmax + 1;
cmax = cb;
point++;
if (cmax >= t) break;
continue;
}
else {
if (cb > cmax) cmax = cb; //if can expand
if (cmax >= t) break;
}
}
if (cmax < t) {
cout << -1 << endl;
return 0;
}
cout << point << endl;
}