题目内容:
有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
c++代码(无注释)
#include<iostream>
#define MAXSIZE 50000
using namespace std;
bool isOverlap(int x[50000][2],int i,int j, int s[]);
void Greedy(int x[50000][2],int n);
int maxNum(int x[],int n);
int main() {
int n, x[MAXSIZE][2];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x[i][0] >> x[i][1];
}
Greedy(x, n);
return 0;
}
bool isOverlap(int x[50000][2], int i, int j,int s[]) {
if (x[i][0] > x[j][1] || x[i][1] < x[j][0]) {
for (int m = j + 1; m < i; m++) {
if (s[m] == s[j] && isOverlap(x, i, m, s))
return true;
}
return false;
}
else
return true;
}
void Greedy(int x[50000][2],int n) {
int s[MAXSIZE] = { 0 };
for (int i=0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (!isOverlap(x, i, j,s)) {
s[i] = s[j];
break;
}
else {
continue;
}
}
if (s[i] == 0)
s[i] = maxNum(s,i) + 1;
}
cout << maxNum(s,n)<< endl;
for (int i = 0; i < n; i++) {
cout << s[i] << endl;
}
}
int maxNum(int x[], int n) {
int max = x[0];
for (int i = 1; i < n; i++) {
if (max < x[i]) {
max = x[i];
}
}
return max;
}