//code by virtualtan 2018 寒7
区间不相交
#include <cstdio>
#include <algorithm>
#define MAXN 1111
using namespace std;
struct node {
int l, r;
}a[MAXN];
int cmp(node x, node xx) {
if(x.r != xx.r) return x.r < xx.r; //从小到大排序就用 ‘<’
return x.l > xx.l;//优先选择右端点小的 若右端点相等 优先左端点大的
}
int n, ans;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + 1 + n, cmp);
// for(int i = 1; i <= n; i++) printf("> %d %d\n", a[i].l, a[i].r);
int R = -2033333333;
// 2147483647
for(int i = 1; i <= n; i++) {
if(R <= a[i].l) {
ans++;
R = a[i].r;//更新 限制区间左端点 的数
}
}
printf("%d", ans);
return 0;
}
区间覆盖
#include <cstdio>
#include <algorithm>
#define MAXN 1111
using namespace std;
struct node {
int l, r;
}a[MAXN];
int cmp(node x, node xx) {
return x.l < xx.l;
}
int n, ans;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + 1 + n, cmp);
int R = 1;
int rr = 0;
for(int i = 1; i <= n; i++) {0
if(a[i].l <= R) rr = max(rr, a[i].r);
if(R > n) break;
if(a[i + 1].l > R || i == n) {
R = rr + 1;//rr 是 已成立的 区间中 最大区间 的右端点
//R是:需要:覆盖区间的左端点 又因为rr 已被覆盖 所以不能写 R == rr
ans++;
}
printf("%d %d %d\n", i, ans, R);
}
printf("%d", ans);
return 0;
}