$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. 归并排序及应用 (nyoj 117 求逆序数)

    求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中 ...

  2. ListView 适配器实现getviewtypecount() 数组越界IndexOutOfBoundException

    ListView中Item的多布局显示,需要用到了getviewtypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误: java.lang.ArrayInde ...

  3. fakeroot与sudo的区别

    fakeroot 可以用来模拟 root 权限,以便建立特定权限与档案拥有者的压缩文件案(tar, ar, .deb 等).透过 LD_PRELOAD 的 dynamic loader 功能,用户不必 ...

  4. C# 递归、try

    一.递归 递归:在函数体内调用本函数自身,直到符合某一条件不再继续调用 两个需要满足的条件1.有反复调用自身函数的过程2.有函数的出口:有不再继续执行的条件 例子: 案例: (一).输入正整数n,求n ...

  5. Pytorch中多GPU训练指北

    前言 在数据越来越多的时代,随着模型规模参数的增多,以及数据量的不断提升,使用多GPU去训练是不可避免的事情.Pytorch在0.4.0及以后的版本中已经提供了多GPU训练的方式,本文简单讲解下使用P ...

  6. ElasticSearch从不懂到会用1—安装篇

    连续加班近一个多月,项目终于告一段落了,也腾出时间写一写项目中用到的东西.在这个项目中,我负责的主要是多种业务场景下的数据查询和搜索,其中搜索用到了ElasticSearch搜索引擎.下面主要围绕El ...

  7. layer/layui弹出层插件bug

    <button class="layui-btn" lay-submit lay-filter="formDemo" id="layui-btn ...

  8. H3C 多路径网络中环路产生过程(2)

  9. linux设备编号的内部表示

    在内核中, dev_t 类型(在 <linux/types.h>中定义)用来持有设备编号 -- 主次部分都包 括. 对于 2.6.0 内核, dev_t 是 32 位的量, 12 位用作主 ...

  10. 2019-9-22-dotnet-core-导出-COM-组件

    title author date CreateTime categories dotnet core 导出 COM 组件 lindexi 2019-09-22 20:25:38 +0800 2019 ...