-
题目内容:
有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>
using namespace std;
int main() {
int n; //牛的头数
int a[100][100]; //a[i][0]表示第i头牛挤奶的开始时间,a[i][1]表示第i头牛挤奶的结束时间,注意头数从0开始
int b[100] = { 0 }; //判断数组,b[i]取0表示第i个畜栏空闲,否则表示已被占领
int c[100] = { 0 }; //c[i]存储第i头牛占有的畜栏的编号
int cnt = 0; //畜栏的个数
cin >> n;
for (int i = 0; i <n; i++) {
cin >> a[i][0] >>a[i][1];
}
for (int i = 0; i<n; i++) {
for (int j = 0; j <n; j++) { //对于每头牛来说,都要从第0个畜栏开始判断,这样当前面的畜栏空出来的话,可以让 当前的牛及时补位
if (b[j] == 0) {
b[j] = a[i][1]; //存储当前占领第j个畜栏的牛的结束时间
cnt++;
c[i] = j;
break;
}
else {
if (a[i][0] > b[j]) { //第i头牛的开始时间大于占领第j个畜栏的牛的结束时间,则该头牛可以占领第j个畜栏
b[j] = a[i][1];
c[i] = j;
break;
}
}
}
}
cout << cnt <<endl;
for (int i = 0; i <= cnt; i++) {
cout << c[i]+1 << endl; //注意编号是从零开始的,而实际是从1开始的
return 0;
}