题意:有n头牛,每头牛都有一段工作时间,问工作t小时最少需要几头牛。即求出最少的区间数覆盖[1,t];
题目链接:http://poj.org/problem?id=2376
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node
{
int x;
int y;
}s[30000];
int cmp(const void*a, const void*b)
{
if((*(struct node*)a).x!=(*(struct node*)b).x)
return (*(struct node*)a).x - (*(struct node*)b).x;
else
return (*(struct node*)b).y - (*(struct node*)a).y;
}
int main()
{
int n;
int t;
int ans,End,time;
while(scanf("%d %d", &n, &t) != -1)
{
for(int i = 0; i < n; i++)
scanf("%d %d", &s[i].x, &s[i].y);
qsort(s,n,sizeof(s[0]),cmp);
if(s[0].x!=1)ans=-1;
else
ans = 1;
time = s[0].y;
if(time<t&&ans==1)
for(int i = 1; i < n; i++)
{
if(s[i].x==s[i-1].x)continue;
if(s[i].x > time+1 || time >= t)break;
if(s[i].y > time)
{
End = s[i].y;
for(int j = i+1; j < n; j++)
{
if(s[j].x==s[j-1].x)continue;
if(s[j].x<=time+1&&s[j].y>=End)
{
End = s[j].y;
i=j;
}
}
time = End;
ans++;
}
}
if(time<t)ans=-1;
printf("%d\n", ans);
}
return 0;
}