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