思路为找到从1号时间开始工作的所有牛,看它们中哪头结束工作时间最晚?选这头。然后找能在前一头牛结束工作之后立刻开始工作的牛中能工作到最晚的那头牛。 如果不能从1时间开始或者不能工作到t时间都输出-1,如果中间到某个时间点找不到能继续工作牛也输出-1 代码如下
#include<bits/stdc++.h>
using namespace std;
struct st
{
int s,e;
};
void gj(st *a,int n,int k)
{
int i;
st t;
i=k;
if(k*2+1<n && a[k*2+1].e>a[i].e)
i=k*2+1;
if(k*2+2<n && a[k*2+2].e>a[i].e)
i=k*2+2;
if(i!=k)
{
t=a[i];
a[i]=a[k];
a[k]=t;
gj(a,n,i);
}
}
int main()
{
int n,t,i,j,y,s=0,ans;
cin>>n>>t;
st a[n],x;
for(i=0;i<n;i++)
{
cin>>a[i].e>>a[i].s;
for(j=i;j && a[j].e>a[(j-1)/2].e;j=(j-1)/2)
{
x=a[j];
a[j]=a[(j-1)/2];
a[(j-1)/2]=x;
}
}
for(i=n-1;i;i--)
{
x=a[0];
a[0]=a[i];
a[i]=x;
gj(a,i,0);
}
//以上为按e升序排列,已经正确
//如果没有从1开始的就无法完成
if(a[0].e>1)
{
cout<<-1;
return 0;
}
//如果没有以t结束的就无法完成
y=1;
for(i=0;i<n;i++)
if(a[i].s>=t)
y=0;
if(y)
{
cout<<-1;
return 0;
}
//从1开始的最晚能到什么时候?
for(i=0;i<n && a[i].e==1;i++)
{
if(a[i].s>s)
s=a[i].s;
}
ans=1;
//从上一头牛停止工作后能马上继续工作的牛中最晚能工作到什么时候
while(i<n)
{
y=s;
for(;i<n && a[i].e<=y+1;i++)
if(a[i].s>s)
s=a[i].s;
ans++;
if(y==s && s<t)//时间还没到,但是找不到继续工作的牛了
{
cout<<-1;
return 0;
}
}
if(s>=t)
cout<<ans;
else
cout<<-1;
return 0;
}