题目
总时间限制: 1000ms 内存限制: 65536kB
描述
农场有N头牛,每头牛会在一个特定的时间区间[A, B](包括A和B)在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求,并要求给出每头牛被安排的方案。对于多种可行方案,主要输出一种即可。
输入
输入的第一行包含一个整数N(1 ≤ N ≤ 50, 000),表示有N牛头;接下来N行每行包含两个数,分别表示这头牛的挤奶时间[Ai, Bi](1 ≤ A≤ B ≤ 1, 000, 000)。
输出
输出的第一行包含一个整数,表示最少需要的畜栏数;接下来N行,第i+1行描述了第i头牛所被分配的畜栏编号(从1开始)。
样例输入
5
1 10
2 4
3 6
5 8
4 7
样例输出
4
1
2
3
2
4
来源
http://poj.org/problem?id=3190
分析
因为每一头牛都要安排位置挤奶,时间不重合的牛可以安排在同一畜栏挤奶,对所有牛根据开始挤奶的时间排序,对于第i头牛,检查畜栏中所有牛的结束时间,选取最先结束的畜栏j,将结束时间与第i头牛的开始时间比较,如果第i头牛开始时间大,就可以将第i头牛放入畜栏j,否则,将畜栏扩充,第i头牛放入扩充的新畜栏里边,畜栏个数加一。
代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define MAX 50010
using namespace std;
struct Node {
int s, e;
int id;
friend bool operator < (const Node & a, const Node & b) {
return a.e > b.e;
}
}cows[MAX];
int use[MAX];
bool cmp (Node & a, Node & b){
return a.s < b.s;
}
priority_queue<Node> q;
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d%d", &cows[i].s, &cows[i].e);
cows[i].id = i;
}
sort(cows, cows + n, cmp);
int ans = 0;
for(int i = 0; i < n; i++){
q.push(cows[i]);
if(!q.empty() && q.top().e < cows[i].s){
use[cows[i].id] = use[q.top().id];
q.pop();
}
else{
ans ++;
use[cows[i].id] = ans;
}
}
printf("%d
", ans);
for(int i = 0; i < n; i++){
printf("%d
",use[i]);
}
return 0;
}