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