“那个屯”是个地名!(@^@)!
思路:
步骤一
先按区间左端点进行排序。
步骤二
设题目里的目标区间为赵四,每次用到的区间为刘能们
第一次操作,找到一个可以覆盖赵四区间左端点(start)的刘能,我们称他为刘大能,同时让这个刘大能的右端(end)点要尽可能地大
第二次到第n次,每次找到一个刘能,可以让刘能覆盖到刘大能的右端点(start),同时让刘能的右区间尽可能地大,找到区间右端点最大的刘能,我们给他命名为刘大能
然后重复次操作,知道出现一个刘大能的右端点可以覆盖掉赵四的区间右端点。
经过这一顿后空翻,我们给这道题目整活了。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int st, ed;
int n;
struct Range{
int l, r;
bool operator< (const Range &W) const{
return l < W.l;
}
}range[N];
int main(){
cin >> st >> ed;
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> range[i].l >> range[i].r;
sort(range, range + n);
int res = 0;
bool success = false;
for (int i = 0; i < n; i ++ ){//遍历找到在所有刘能中的左端点在start的左端,且右端点最大的区间刘能
int j = i, r = -2e9;//j为刘能的编号,r为编号为j的刘能的区间右端点能达到的最大值
while (j < n && range[j].l <= st){//如果刘能没用完,同时刘能的左端点小于赵四(或刘大能)的左端点
r = max(r, range[j].r);
j ++;
}
if (r < st){//没有一个刘能可以盖的住赵四,双方牵手失败,可惜不是你~
res = -1;
break;
}
res ++;//刘能成功一步,记上一笔
if (r >= ed){
success = true;
break;//刘能最总盖住赵四,嘉宾牵手成功
}
st = r;
i = j - 1;//找到j后,刘大能就是i了i了
}
if (success) cout << res << endl;
else cout << -1 << endl;
return 0;
}