首先,结构体数组记录数据。
然后再开个结构体数组记录每一个较优秀的奶牛。
我对每一个奶牛进行排序,开始时间小的在前;开始时间相同,结束时间大在前。
然后对每一个开始时间不同的奶牛进行保留;(开始时间相同,只保留结束时间晚的那个哦)
对我认为的优秀奶牛查找,是否能覆盖整个区间。
对第二步骤中的新产生的数组进行查找
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct Cow{
int start,end;
};
int Pos[1000010];
bool Comp(Cow a,Cow b)
{
if (a.start!=b.start)
return a.start < b.start;
else
return a.end > b.end;
}
int main()
{
int n,t,count=0,f=0;
bool flag=true;
scanf ("%d %d",&n,&t);
memset(Pos,-1,sizeof(Pos));
Cow *s=(Cow*)malloc (sizeof(Cow)*(n+5));
Cow *a=(Cow*)malloc (sizeof(Cow)*(n+5));
for (int i=0;i<n;i++)
{
scanf ("%d %d",&s[i].start,&s[i].end);
}
sort(s,s+n,Comp);
a[1].start=s[0].start;
a[1].end=s[0].end;
f=1;
Pos[a[f].start]=f;
for (int i=1;i<n;i++)
{
if (s[i].start!=a[f].start&&s[i].end>a[f].end)
{
f++;
a[f].start=s[i].start;
a[f].end=s[i].end;
Pos[a[f].start]=f;
}
}
int i,j;
for (i=1;i<=f;)
{
j=a[i].end+1;
if (a[i].end==t)//是否到达最后一班. 是,则退出
{
count++;
break;
}
while(Pos[j]==-1&&j>a[i].start)
{
j--;
}
if (j==a[i].start)
{
flag=false;
break;
}
count++;
i=Pos[j];
}
if (a[1].start!=1 || a[f].end!=t)
flag=false;
if (flag)
printf("%d\n",count);
else
printf("-1\n");
free(s);
free(a);
return 0;
}