$Poj$    $AcWing$    $Luogu$
$ps:$洛谷题目与$Poj$略有不同,以下$Description$是$Poj$版.题目的不同之处在于洛谷中雇用奶牛的费用不相同,所以不可以用贪心法,只能$DP$

$Description$

$Sol$

就是区间覆盖问题$qwq!$

1.$DP$做!

$F[i]$表示覆盖$[1,i]$所需要的最小牛个数

把牛的工作时间按照右端点(结束时间)r[i]从小到大排序,按顺序扫描这些牛.设当前为第$i$头牛,则:

$F[r[i]]=(min_{l_i-1<=j<r_i}^{ }F[j])+1$

$F[0]=0$,其余初始化为+∞

算法导练: 带修改的区间最值问题$???$线段树$!!!$

2.贪心做!

比$DP$好写多了,$DP$还要写线段树...

首先是排序,把所有的区间按照右端点从小到大排序,按顺序扫描这些区间.

简单来说把答案区间依次存在队列中,如果当前区间可以替代队尾区间就删掉队尾,重复循环($while$),然后在把当前区间加入区间

那么怎样的叫可以替代呢,就是当前区间的左端点小于或者等于队尾的前一个区间的右端点加$1$就合法,这样保证了每个点都被覆盖到,满足上述条件,且当前区间比队尾区间的右端点更大(或等),所以当前区间一定更优.

细节:在从左到右扫描区间的过程中,若队尾区间的右端点已经$>=T$,那么一定要跳出循环,否则答案可能偏大

$Code$

#include<bits/stdc++.h>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i--)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,t,p,minl=1e9,maxr;
struct node{int l,r,k;}a[],as[];
il bool cmp(node x,node y){if(x.r==y.r)return x.l<y.l;return x.r<y.r;}
int main()
{
n=read(),t=read();
go(i,,n){a[i]=(node){read(),read()};minl=min(minl,a[i].l),maxr=max(maxr,a[i].r);}
if(minl> || maxr<t){printf("-1\n");return ;}
sort(a+,a+n+,cmp);
bool fl=;
go(i,,n)
{
if(as[p].r>=t)break;
while(p && as[p].k>=a[i].l)p--;
if(a[i].l<=as[p].r+){as[++p]=a[i];as[p].k=as[p-].r+;}
}
if(as[p].r>=t)printf("%d\n",p);
else printf("-1");
return ;
}

贪心 code

随机推荐

  1. mysql数据库之去重

    利用 distinct :对需要处理的字段进行去重 select  distinct 字段名 from 表名 去重以后 利用group by select * from 表名 group by 字段名 ...

  2. oracle避免在索引列上使用IS NULL和IS NOT NULL

    避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空 ...

  3. 推荐几个web前端比较实用的网站

    第一次写博客,说实在的有点紧张和兴奋,哈哈哈哈,本人工作了有两年的时间,平时也有做笔记的习惯,但是都做得乱七八糟的,所以就想通过写博客来记录.好了,废话不多说了,先来几个觉得在工作中使用到的,还不错的 ...

  4. Java 对象序列化机制详解

    对象序列化的目标:将对象保存到磁盘中,或允许在网络中直接传输对象. 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传 ...

  5. tensorflow -gpu安装,史上最新最简单的途径(不用自己装cuda,cdnn)

    tensorflow -gpu安装首先,安装Anoconda1. 官网下载点我: 2.安装 点击 python 3.6 version自动下载x64版,下载好之后,然后安装. 如图,打上勾之后,一路n ...

  6. H3C OSPF协议分区域管理

  7. Mac下SVN基本操作和常见错误

    一.基本操作 1  从服务器上下载代码 svn checkout http://xxx.xxx.xxx/xxx 2  获取最新的代码 svn update 3  提交代码 svn commit -m ...

  8. easyui—element-ui框架套用(表格宽度自适应)

    外层使用easyui框架中window组件,便于使用最大化功能:内部表格使用element-ui在的el-table,el-table列宽须设置为最小宽度才能在最大化窗口时列表中列宽自适应window ...

  9. tf.squeeze()

    转载自:https://www.cnblogs.com/mdumpling/p/8053376.html 原型 tf.squeeze(input, squeeze_dims=None, name=No ...

  10. Windows 服务安装与卸载 (通过 installutil.exe)

    1. 安装 安装 .NET Framework ; 新建文本文件,重命名为 ServiceInstall.bat,将 ServiceInstall.bat 的内容替换为: C:\\Windows\\M ...