Cleaning Shifts POJ - 2376

贪心的思想:每次在可以选择的范围内都尽量选择右边界更大的牛


题目的意思理解错了。。。。。本来错误的认为

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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值