题意:有一些奶牛,每只奶牛负责一个时间段。问覆盖完全部的时间段最少需要多少只奶牛。若不能全部覆盖,输出-1
样例输入:
4 10
1 7
3 6
3 10
6 10
输出 :
2;
#include <iostream>
#include <cstdio>
#include <string.h>
#include <climits>
#include <algorithm>
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;
}