/*
题目内容:有n头牛(1<=n<=50,000)要挤奶。
给定每头牛挤奶的时间区间[A,B](1<=A<=B<=1,000,000,A,B为整数)。
牛需要呆在畜栏里才能挤奶。一个畜栏同一时间只能容纳一头牛。
问至少需要多少个畜栏,才能完成全部挤奶工作,以及每头牛都放哪个畜栏里?
注意:在同一个畜栏的两头牛,它们挤奶时间区间不能在端点重合。
输入格式:
第1行:一个正整数N;
第2..N+1行:第i+1行的两个整数给出第i头奶牛的挤奶时间。
输出格式:
第1行:需要畜栏的最小数;
第2..N+1行:第i+1行表示第i头奶牛被分配到的畜栏序号
输入样例:
5
1 10
2 4
3 6
5 8
4 7
输出样例:
4
1
2
3
2
4
*/
#include<iostream>
using namespace std;
//奶牛结构体
struct cow
{
long start; //开始挤奶的时间
long end; //结束挤奶的时间
long bucketNum=-1; //分配的奶桶编号
};
//奶桶结构体
struct bucket
{
long sn; //编号
bool inUse=false; //正在使用的状态
long latesUseEndTime=-1; //上次结束使用的时间
};
//题目要求的数字太大了,用数组会栈溢出,而动态分配内存又比较麻烦,所以只好先用小的数目
const int MAXNUM = 50;
//根据给定的奶牛开始挤奶的时间,确定它对应的最早可用的已有的奶桶编号,如果没有则返回负数
long getFirstProperBucket(struct bucket buc[], long total, long startTime) {
long ret = -1; //若已经使用过的奶桶中没有可用的,则返回负数
for (long i = 0; i < total; i++) {
//如果上一次使用的结束时间比现在要求的开始时间早,则可用
if (buc[i].latesUseEndTime < startTime) {
ret = i;
break;
}
}
return ret;
}
//returns the total amount of buckets needed
int solve(struct cow cow[], long n) {
struct bucket buc[MAXNUM]; //奶桶数组,最多每头奶牛分配一个奶桶
long total = 0; //总共所需奶桶数目
for (long i = 0; i < n; i++) {
long b = getFirstProperBucket(buc, total, cow[i].start); //获取一个编号
if (b >= 0) { //如果是正数,代表可用
}
else { //如果是负数,不可用,则添加一个新的奶桶,再分配编号
total++;
b=getFirstProperBucket(buc, total, cow[i].start);
}
buc[b].latesUseEndTime = cow[i].end; //将奶桶的上次使用结束时间标记上
cow[i].bucketNum = b; //将奶桶编号记录到奶牛
}
return total;
}
int main() {
struct cow cow[MAXNUM]; //奶牛数组
long n; //奶牛数量
cin >> n;
//输入数据和初始化
for (long i = 0; i < n; i++)
{
cin >> cow[i].start >> cow[i].end;
cow[i].bucketNum = -1;
}
//所需的奶桶数目
int num = solve(cow, n);
cout << num << endl;
//依次输出奶牛分配的奶桶编号
for (long i = 0; i < n; i++) {
cout << cow[i].bucketNum+1<<endl;
}
cin >> num; //VC中防止程序直接结束
return 0;
}