Poj 2376 贪心算法;

题意:有一些奶牛,每只奶牛负责一个时间段。问覆盖完全部的时间段最少需要多少只奶牛。若不能全部覆盖,输出-1

样例输入:

4 10

1 7

3 6

3 10

6 10

输出 :

2;

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 25005;
struct intversal{
	int begin,end;
}aa[N];

bool cmp(intversal a,intversal b){
	if(a.begin == b.begin)
		return a.end < b.end;
	return a.begin < b.begin;
}
int main(){
	//freopen("1.txt","r",stdin);
	int n,T;
	while(scanf("%d%d",&n,&T) != EOF){
		for(int i = 0; i < N; ++i){
		  aa[i].begin = INT_MAX;
		  aa[i].end = INT_MAX;
		}
	    for(int i = 0; i < n; ++i)
			scanf("%d%d",&aa[i].begin,&aa[i].end);
		sort(aa,aa+n,cmp);
		if(aa[0].begin > 1){
		  printf("-1\n");
		  continue; 
		}
		int ans = 1,id = 0;
		for(int i = 0; i < n; ){  //控制从找到的符合条件的下一个位置开始寻找
			int cnt = 0;
			for(int j = i + 1; j < n; ++j){
				if(aa[j].begin > aa[id].end + 1)
					break;
				if(aa[j].begin >= aa[id].begin && aa[j].end >= aa[id].end + 1){
					if(aa[j].end > aa[cnt].end)  // 选出符合条件的最优解 比如3~6和3~10要选择end最大的奶牛进行工作
				       cnt = j;
				}
			}
			if(cnt == 0){  //如果没有符合条件的不至于不能跳出循环
			  i++;
			}
			else{
			  id = cnt;
			  ans++;
			  i = id;
			}
		}
		if(aa[id].end == T){
		  printf("%d\n",ans);
		}
		else
			printf("-1\n");
	}
	return 0;
}

 

你可能感兴趣的:(贪心算)