贪心算法求解畜栏问题
求解畜栏问题
题目内容:
有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
using namespace std;
typedef struct {
int begin;
int end;
int number;
int NO;
bool f;
}cow;
cow a[50000];
int minNumber=0;
bool compare1(cow c1,cow c2){
if(c1.end<=c2.end) return true;
else return false;
}
bool compare2(cow c1,cow c2){
if(c1.NO<c2.NO) return true;
else return false;
}
void getCorril(int n){
sort(a+1,a+n+1,compare1);
bool flag=false;//还有牛未分配
while(!flag){
minNumber++;
int foreend=0;
flag=true;
for(int i=1;i<=n;i++){
if(a[i].begin>foreend&&a[i].number==0){
a[i].number=minNumber;
flag=false;
foreend=a[i].end;
}
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].begin,&a[i].end);
a[i].number=0;
a[i].NO=i;
a[i].f=false;
}
getCorril(n);
printf("%d\n",minNumber-1);
sort(a+1,a+n+1,compare2);
int count=0;//这番操作只是为了解决先输入的信息的牛占据编号小的畜栏这个**的问题
for(int i=1;i<=n;i++){
if(!a[i].f){
int m=a[i].number;
a[i].number=++count,a[i].f=true;
for(int j=i+1;j<=n;j++){
if(a[j].number==m&&a[j].f==false){
a[j].number=count;
a[j].f=true;
}
}
}
}
for(int i=1;i<=n;i++) printf("%d\n",a[i].number);
return 0;
}