题目
思路
- 将所有区间左端点从小到大排序
- 从前往后枚举每个区间,在所有能够覆盖
start
的区间当中,选择右端点最大的区间,然后将start
更新成右端点的最大值。 - 如果最后能够覆盖区间,返回操作数,否则,返回
-1
代码
```cppinclude
include
using namespace std;
const int N = 1e5 + 5;
static bool cmp (const pair
int main() {
int start = 0, end = 0;
cin >> start >> end;
int n = 0;
cin >> n;
pair
sort(nums, nums + n, cmp);
int ans = 0, max_range = 0;
for (int i = 0; i < n; ++i) {
if (nums[i].first > start) {
cout << "-1" << endl;
return 0;
}
ans++;
max_range = -2e9;
// 选择右边界最远的区间
for (int j = i; j < n; j++) {
if (nums[j].first > start)
break;
max_range = max(max_range, nums[j].second);
i = j;
}
// 如果成功超过左边界了
if (max_range >= end) {
cout << ans << endl;
return 0;
}
//如果右边界完全没有更新
if (max_range == -2e9) {
cout << "-1" << endl;
return 0;
}
// 更新下一次操作
start = max_range;
}
if (max_range < end) {
cout << "-1" << endl;
} else {
cout << ans << endl;
}
return 0;
} ```