很简单的一道题,总是写傻逼。就是给你N个区间,问你能覆盖1到T全部,需要的最少区间个数。
很容易就能想到贪心,做法也很简单,只要按照first从小到大,first相同的按second从小到大。
每次都寻找first < end+1的然后second最大的就行。但我错误的认为,排序之后后面只要frist符合的一定second都比前面的大,结果没有更新找到的点,但应为first会改变,所以second的值也不确定。
所以。。。太傻逼了
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
const int MAX = 25010;
typedef pair<int,int> P;
P p[MAX];
int N,T;
bool cmp(P A,P B){
if(A.first == B.first)
return A.second < B.second;
else
return A.first < B.first;
}
int Find(int x){
int pos = x;
for(int i=x+1;i<=N;++i){
if(p[i].first <= p[x].second+1){
if(p[i].second > p[pos].second)//这里要更新pos,因为后面的second不一定更大。
pos = i;
}
else{
break;
}
}
return pos;
}
int solve(){
int now = 0,end = 0,res = 0;
while(end < T){
int v = Find(now);
if(v == now)
return -1;
else{
res++;
now = v;
end = p[now].second;
}
}
return res;
}
int main(void){
cin >> N >> T;
for(int i=1;i<=N;++i){
cin >> p[i].first >> p[i].second;
}
sort(p+1,p+1+N,cmp);
cout << solve() << endl;
return 0;
}