畜栏问题
题目内容:
有n头牛(1<=n<=50,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
时间限制:500ms内存限制:32000kb
/*C++代码*/
#include <stdio.h>
typedef struct time
{
int start, end, number;
}T;
int main()
{
int n, count = 1, k = 0, s = 1, max;
T *stu;
scanf("%d", &n);
stu = new time[n];
for (int i = 0; i < n; i++)
{
scanf("%d %d", &stu[i].start, &stu[i].end);
}
stu[0].number = 1;
for (int i = 1; i < n; i++)
{
if (k == 0)
{
s++;
count++;
}
for (int j = 0; j < s; j++)
{
if (stu[i].start > stu[j].end)
{
stu[i].number = stu[j].number;
stu[j].start = stu[i].start;
stu[j].end = stu[i].end;
k = 1;
break;
}
else
{
stu[i].number = count;
k = 0;
}
}
}
max = stu[0].number;
for (int i = 1; i < n; i++)
{
if (stu[i].number > max)
{
max = stu[i].number;
}
}
printf("%d\n", max);
for (int i = 0; i < n; i++)
printf("%d\n", stu[i].number);
}