poj之旅——2376

题目描述及题解:

给定N个小区间以及区间起点终点,求能用它们覆盖区间[1,T]的最小组合。

贪心策略是从左往右,尽量选择长度最大的区间。

首先对所有奶牛排序,按照开始时间排序。

然后更新起点=终点+1,搜索剩下的奶牛中能够覆盖这个起点同时终点最远的那一头,更新终点。

参考程序

<span style="font-size:24px;">#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
struct Cow{
	int begin,end;
};
Cow cow[26000];
int a[10000];
int N,T;
bool cmp(Cow a,Cow b){
	return (a.begin<b.begin) || (a.begin==b.begin && a.end>b.end);
}
int main(){
	scanf("%d %d",&N,&T);
	for (int i=0;i<N;i++)scanf("%d %d",&cow[i].begin,&cow[i].end);
	sort(cow,cow+N,cmp);
	int index=0,used=0;
	for (int begin=0,end=0;end<T;){
		begin=end+1;
		for (int i=index;i<N;i++)
			if (cow[i].begin<=begin)
				if (cow[i].end>=begin)
					end=max(end,cow[i].end);
				else;
			else {
				index=i;
				break;
			}
		if (begin>end){used=-1;break;}
		else used++;	
	}
	printf("%d",used);
	return 0;
}</span>


你可能感兴趣的:(poj之旅——2376)