题目链接: 【POJ—2376 Cleaning Shifts】
题目大意:一堆区间,用最少的区间覆盖整个区间。
好吧其实我本来打算用动态规划的,但是区间太长了(10^6)。so。。。老老实实用贪心。
这次总算长记性了,自己多试了几组数据,没有起点的,没有终点的,不过注意一点:(1,5)(6,10)这样的区间是连续的。
/***********************************
Problem: 2376 User: ChenyangDu
Memory: 860K Time: 63MS
Language: G++ Result: Accepted
************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,T,ans,r;
struct cow{int s,t;}in[25000+5];
bool operator < (cow a,cow b){
return a.s<b.s;
}
void input(){
scanf("%d%d",&n,&T);
for(int i=0;i<n;i++){
scanf("%d%d",&in[i].s,&in[i].t);
}
sort(in,in+n);
}
bool dfs(int a){//我也不知道是不是应该叫dfs,反正就是起点至少从a开始的
if(a>T)return true;
ans++;
int max_t = 0;
for(int i=r;i<n;i++){
if(in[i].s <= a){
max_t = max(max_t,in[i].t);
}else{
if(max_t == 0)return false;
r = i;
return dfs(max_t+1);
}
}
return max_t>=T;
}
int main(){
//freopen("in.txt","r",stdin);
input();
if(dfs(1))printf("%d\n",ans);
else cout<<"-1\n";
fclose(stdin);
return 0;
}