题目

image.png

思路image.png

  • 将所有区间左端点从小到大排序
  • 从前往后枚举每个区间,在所有能够覆盖start的区间当中,选择右端点最大的区间,然后将start更新成右端点的最大值。
  • 如果最后能够覆盖区间,返回操作数,否则,返回-1

    代码

    ```cpp

    include

    include

using namespace std;

const int N = 1e5 + 5;

static bool cmp (const pair &a, const pair &b) { return a.first < b.first; }

int main() {
int start = 0, end = 0; cin >> start >> end; int n = 0; cin >> n; pair nums[N]; for (int i = 0; i < n; ++i) { cin >> nums[i].first >> nums[i].second; }

  1. sort(nums, nums + n, cmp);
  2. int ans = 0, max_range = 0;
  3. for (int i = 0; i < n; ++i) {
  4. if (nums[i].first > start) {
  5. cout << "-1" << endl;
  6. return 0;
  7. }
  8. ans++;
  9. max_range = -2e9;
  10. // 选择右边界最远的区间
  11. for (int j = i; j < n; j++) {
  12. if (nums[j].first > start)
  13. break;
  14. max_range = max(max_range, nums[j].second);
  15. i = j;
  16. }
  17. // 如果成功超过左边界了
  18. if (max_range >= end) {
  19. cout << ans << endl;
  20. return 0;
  21. }
  22. //如果右边界完全没有更新
  23. if (max_range == -2e9) {
  24. cout << "-1" << endl;
  25. return 0;
  26. }
  27. // 更新下一次操作
  28. start = max_range;
  29. }
  30. if (max_range < end) {
  31. cout << "-1" << endl;
  32. } else {
  33. cout << ans << endl;
  34. }
  35. return 0;

} ```