穿越隧道
开始的思路 对N个区间的区间长度进行从大到小排序,因考虑到要最少的区间来对目标区间进行覆盖。 后来,发现有点难以实现,看了y总的思路是:对N个区间的左端点,进行从小到大排序,找到左端点小于st,且右端点最大的区间来更新st,直到扫描完所有的区间,判断此时的st是否>=ed,若是,则成功覆盖,否则失败。 采用了双指针的思想
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N = 1e5 + 10;
int n,k;
int s,t;
pii range[N];
int ans;
int main(){
cin >> s >> t;
if(s > t) swap(s,t);
int n;
cin >> n;
for(int i = 0; i < n; i++){
int a,b;
cin >> a >> b;
if(a > b) swap(a,b);
range[i] = {a,b};
}
sort(range,range+n);
int res = 0;
bool suc = false;
int r = -2e9;
for(int i = 0,j = 0; i < n; i++){
j = i,r = -2e9;
while(j < n && range[j].x <= s){
r = max(r,range[j].y);
j++;
}
if(r < s){
res = -1;
break;
}
res++;
if(r >= t){
suc = true;
break;
}
s = max(s,r);
i = j - 1;
}
if(!suc) res = -1;
cout << res << endl;
return 0;
}
|