题目
思路
- 将所有区间左端点从小到大排序
- 从前往后枚举每个区间,在所有能够覆盖
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;
} ```
