http://poj.org/problem?id=3190
做法:很明显就是贪心啦,将他们的区间从小到大排序,从小的开始枚举,然后尽量往里面塞东西。最后得到答案。
代码如下:
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node {
int s, e, id;
}a[50005];
bool cmp(node x, node y) {
if(x.s == y.s)
return x.e < y.e;
return x.s < y.s;
}
int main() {
int n, cnt = 0;
int b[50005] = {0};
int vst[50005] = {0};
cin >> n;
for(int i = 0; i < n; i++) {
scanf("%d%d", &a[i].s, &a[i].e);
a[i].id = i;
}
sort(a, a + n, cmp);
for(int i = 0; i < n; i++)
b[i] = a[i].s;
for(int i = 0; i < n; i++) {
int k = a[i].id;
if(vst[k])
continue;
cnt++;
vst[k] = cnt;
int key = upper_bound(b, b + n, a[i].e) - b;
k = a[key].id;
while(key < n && vst[k]) {
key++;
k = a[key].id;
}
while(key < n) {
vst[k] = cnt;
key = upper_bound(b, b + n, a[key].e) - b;
k = a[key].id;
while(key < n && vst[k]) {
key++;
k = a[key].id;
}
}
}
cout << cnt << endl;
for(int i = 0; i < n; i++)
cout << vst[i] << endl;
return 0;
}