这题在贪心的时候需要注意一下技巧,否则就会超时。
没有直接选取第一个点,而是比较之后选了最优的一个点。
如果没有解直接结束。
两个点之间是不连续的,所以第一次覆盖这个点之后,下一次可以直接从这个点+1开始。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
using namespace std;

int T, N;

struct node
{
    int S;
    int D;

    bool operator < (const struct node &A)
    {
  //      if(this->S == A.S)                    //因为下面没有直接选择第一个点,所以可以不加
    //        return this->D > A.D;

        return this->S < A.S;
    }
};

typedef struct node Node;

Node A[25100];

int main()
{
    freopen("G:\\data.txt", "r", stdin);

    while(scanf("%d%d", &N, &T) == 2)
    {
        for(int i = 0; i < N; i++)
        {
            scanf("%d%d", &A[i].S, &A[i].D);
        }
        sort(A, A+N);

        int right = 1, ans = 0;
        int flag = 0;

        int i = 0;

        while(flag <= T)
        {
            for(; i < N && A[i].S <= right ; i++)
            {
                if(A[i].D > flag)
                {
                    flag = A[i].D;
                }
            }

            if(flag >= right)           //因为下面多加了一个一,所以可以等于
            {
                right = flag + 1;       //加一是因为每个点不是连续的,中间可以没有奶牛,只要两个点有就行
                ans++;
            }else
            {
                break;
            }
        }

        if(right <= T)
        {
            ans = -1;
        }

        printf("%d\n", ans);
    }

    return 0;
}