贪心算法

求解畜栏问题(20分)
题目内容:

有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
#include
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;
}

你可能感兴趣的:(算法)