应该还是蛮简单的一题,但是因为模拟太差,一直没调出来.......

\(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\)。

\(那么第一个区间的l一定要是1,而且必拿(否则没有区间能包括1)\)

\(往后找一个R尽可能大的区间,前提是L被我们上一个选的区间的R+1包括\)

\(重复\)

细节还比较多,我还是太菜了啊

#include <bits/stdc++.h>
using namespace std;
struct p{
int l,r;
}b[25009],a[25009];int n,t,cnt;
bool com(p a,p b){
if(a.l==b.l) return a.r>b.r;
else return a.l<b.l;
}
void last(){
cout<<-1;
exit(0);
}
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++)
{
cin>>b[i].l>>b[i].r;
if(b[i].l<1) b[i].l=1;
}
sort(b+1,b+1+n,com);b[0].l=-1;
for(int i=1;i<=n;i++)
if(b[i].l!=b[i-1].l) a[++cnt]=b[i];//选取L相同时区间中的最优区间。不放到a数组里面也没事
if(a[1].l!=1) last();
int ans=1,tim,zan,i=1,num,flag;
while(1)
{
zan=a[i].r,tim=a[i].r,i++,flag=0;
if(tim>=t) break;
if(i>=cnt+1) last();
while(i<=cnt&&a[i].l<=tim+1)
{
if(zan<a[i].r)
flag=1,zan=a[i].r,num=i;
i++;
}
if(flag==0) last();
i=num,ans++;
}
cout<<ans;
}

然后下面是借鉴别人改进过的写法

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std;
struct p{
int l,r;
}b[25009],a[25009];int n,t,cnt;
bool com(p a,p b){
if(a.l==b.l) return a.r>b.r;
else return a.l<b.l;
}
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++)
{
cin>>b[i].l>>b[i].r;
if(b[i].l<1) b[i].l=1;
}
sort(b+1,b+1+n,com);b[0].l=-1;
for(int i=1;i<=n;i++)
if(b[i].l!=b[i-1].l) a[++cnt]=b[i];
int maxn=0,minn=0,top=1,ans=0;
while(maxn<t)
{
minn=maxn+1;//上一次覆盖的区间+1
for(int i=top;i<=cnt;i++)
{
if(a[i].l>minn)
{
top=i;
break;
}
else
maxn=max(maxn,a[i].r);
}
if(maxn==minn-1) break;//匹配失败
ans++;
}
if(maxn>=t) cout<<ans;
else cout<<-1;
}

POJ2376Cleaning Shifts(区间覆盖贪心)的更多相关文章

  1. codeforces Gym 100187F F - Doomsday 区间覆盖贪心

    F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ...

  2. UVa 10382 Watering Grass (区间覆盖贪心问题+数学)

    题意:有一块长为l,宽为w的草地,在其中心线有n个喷水装置,每个装置可喷出以p为中心以r为半径的圆, 选择尽量少的装置,把草地全部润湿. 析:我个去啊,做的真恶心,看起来很简单,实际上有n多个坑啊,首 ...

  3. POJ 2376 Cleaning Shifts 区间覆盖问题

    http://poj.org/problem?id=2376 题目大意: 给你一些区间的起点和终点,让你用最小的区间覆盖一个大的区间. 思路: 贪心,按区间的起点找满足条件的并且终点尽量大的. 一开始 ...

  4. POJ 2376 Cleaning Shifts (贪心,区间覆盖)

    题意:给定1-m的区间,然后给定n个小区间,用最少的小区间去覆盖1-m的区间,覆盖不了,输出-1. 析:一看就知道是贪心算法的区间覆盖,主要贪心策略是把左端点排序,如果左端点大于1无解,然后, 忽略小 ...

  5. 高效算法——E - 贪心-- 区间覆盖

    E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...

  6. 贪心算法----区间覆盖问题(POJ2376)

    题目: 题目的大概意思是约翰这个农民有N条牛,这些牛可以在一天中的某个时间段可以进行工作,他想把这个时间段分成若干个片段让这些牛去进行打扫任务,你的任务是安排尽量少的牛然后可以完成分成这些片段的打扫任 ...

  7. UVA 10382 Watering Grass(区间覆盖,贪心)题解

    题意:有一块草坪,这块草坪长l 米,宽 w 米,草坪有一些喷头,每个喷头在横坐标为 p 处,每个喷头的纵坐标都是(w/2) ,并且喷头的洒水范围是一个以喷头为圆心,半径为 r 米的圆.每次最少需要打开 ...

  8. 贪心问题:区间覆盖 POJ 1328 Rader Installation

    题目:http://poj.org/problem?id=1328 题意:给定海岛个数,雷达半径,输入各个海岛坐标,求能覆盖所有海岛的最少雷达数 题解: 1. 贪心的区间覆盖问题,尽量让每个雷达覆盖更 ...

  9. 贪心问题:区间覆盖 NYOJ 喷水装置(二)

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水 ...

随机推荐

  1. 挑战全网最幽默的Vuex系列教程:第一讲 Vuex到底是什么鬼

    先说两句 官方已经有教程了,为什么还要写这个教程呢?说实话,还真不是我闲着蛋疼,官方的教程真的是太官方了,对于刚入门 Vuex 的童鞋来说,想必看官方的教程,很多地方就如同看圣经一样,比如「欧玛尼玛尼 ...

  2. HttpClient之Get请求和Post请求示例

    HttpClient之Get请求和Post请求示例 博客分类: Java综合   HttpClient的支持在HTTP/1.1规范中定义的所有的HTTP方法:GET, HEAD, POST, PUT, ...

  3. 程序员小张的第一篇博文 --记Markdown的使用学习

    1.前言 为了即将到来的面试做准备,以及记录一下平日里自己的学习过程和生活日常,我开始进驻博客园啦!这就是我的第一篇博客(有点小激动)~ 作为一只新手,首先记录一下今晚的编写博文的学习过程吧~ 2.使 ...

  4. [javascript]JS获取当前时间戳的方法

    JavaScript 获取当前时间戳: 第一种方法:(这种方法只精确到秒) var timestamp = Date.parse(new Date()); 结果:1280977330000 第二种方法 ...

  5. Springboot:员工管理之环境准备(十(1))

    1:静态资源 下载静态资源:https://files.cnblogs.com/files/applesnt/ztzy.zip 项目下载:https://files.cnblogs.com/files ...

  6. python中文资源大全

    Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...

  7. RESTFul 设计规范

    REST这个词,是Roy Thomas Fielding博士在他2000年提出的,有兴趣的可以阅读一下他的论文, 论文地址为:http://www.ics.uci.edu/~fielding/pubs ...

  8. Mysql链接查询

    连接查询--交叉连接将两张表的数据与另外一张表彼此交叉原理:1. 从第一张表一次取出每一条记录2. 取出每一条记录之后,与另外一张表的全部记录挨个匹配3. 没有任何匹配条件,所有的结果都会进行保留4. ...

  9. Golang Map实现(一)

    本文学习 Golang 的 Map 数据结构,以及map buckets 的数据组织结构. hash 表是什么 从大学的课本里面,我们学到:hash 表其实就是将key 通过hash算法映射到数组的某 ...

  10. 堆溢出---glibc malloc

    成功从来没有捷径.如果你只关注CVE/NVD的动态以及google专家泄露的POC,那你只是一个脚本小子.能够自己写有效POC,那就证明你已经是一名安全专家了.今天我需要复习一下glibc中内存的相关 ...