POJ 2376 Cleaning Shifts

题意

找到能覆盖全部区间范围的最小子区间数,没有则输出-1

题解

  1. 对区间按起点升序排序,起点相同则按终点升序排序。(排序后才可以用贪心,因为起点大的在已覆盖区间中时,那么起点小的一定也在,此时只要比较谁的终点大即可)
  2. 寻找最佳的子区间(区间的终点最远且起点在当前已覆盖区间的范围内),终止条件是:当前子区间的下一个子区间不在已覆盖区间范围内
  3. 更新当前已覆盖区间(变量now)

注意: 在区间的条件是:[now.from, now.to+1]

代码

#include <iostream>
#include <algorithm>
#define MAXN 100000
#define INF 0x7fffffff
using namespace std;
struct Line
{
    int from;
    int to;
};
Line line[MAXN];
struct compare
{
    bool operator()(Line l1,Line l2)
    {
        if(l1.from < l2.from)
            return true;
        if(l1.from == l2.from && l1.to < l2.to)
            return true;
        else
            return false;
    }
};
int n,m;
int solve()
{
    int cnt = 0;
    int flag = 0;
    line[n].from = INF;
    Line now;
    now.from = 0;
    now.to = 0;
    int last = 0;
    for(int i = 0 ;i < n; i++)
    {
        if(line[i].from <= now.to + 1 && line[i].to > last) //find a line with max len in interval
        {
            last = line[i].to;
            flag = 1;
        }
        if(flag && line[i+1].from > now.to + 1) //flag means has find a proper interval
        {
            now.to = last;
            flag = 0;
            cnt++;
        }
    }

    if(last < m)
        cnt = -1;

    return cnt;
}
int main()
{
    cin>>n>>m;

    for(int i = 0; i < n; i++)
        cin>>line[i].from>>line[i].to;
    sort(line,line+n, compare());

    cout<< solve() <<endl;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值