贪心的思想:每次在可以选择的范围内都尽量选择右边界更大的牛
题目的意思理解错了。。。。。本来错误的认为
3 10
1 2
3 4
5 10
会输出-1;
这里的数字代表的是第几分钟而不是坐标轴上的点。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int Max = 25000;
// 对象
int N, T;
struct Interval
{
int b, e;
} I[Max];
// 函数
bool greater( const Interval & i1, const Interval & i2 )
{
return i1.b < i2.b;
}
int Greedy()
{
int num = 0; // 最少区间数
int right = 0; // 已覆盖区间右端点
int top = 0; // 集合首
while( right < T )
{
// 选出包含begin的区间中右端点最大的那个
int begin = right + 1; // 待覆盖的起点
for( int i = top; i < N; ++ i )
{
if( I[i].b <= begin && I[i].e >= begin )
right = I[i].e > right ? I[i].e : right;
else if( I[i].b > begin )
{
top = i;
break;
}
}
// 没有包含begin的区间
if( begin > right ) break;
else ++ num;
}
if( right == T ) return num;
else return -1;
}
int main()
{
scanf( "%d%d", & N, & T );
for( int i = 0; i < N; ++ i )
scanf( "%d%d", & I[i].b, & I[i].e );
sort( I, I + N, greater );
printf( "%d\n", Greedy() );
return 0;
}