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

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

\(那么第一个区间的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. python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟

    因为最近发现咪咕音乐版权好多,当时我就在想是不是可以爬取下来,然后花了一些时间,发现有加密,虽然找到了接口,但是只能手动下载VIP歌曲,对于我们学IT的人来说,这是不能忍的,于是就懒得去解密抓取了,但 ...

  2. docker中的dockerfile

    什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. docker ...

  3. ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

    ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...

  4. 【Canvas】(2)---绘制折线图

    绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...

  5. 【three.js第四课】自定义材料、贴图。

    1.先去下载6张不同的图片素材放到项目中. 2.在[three.js第三课]的代码基础上添加自定义的材料 //自定义材料 cubeMaterial 数组 //map:用于加载图片,THREE.Text ...

  6. 试验使用t检验

    官方解释 Excel中使用T.TEST函数 T.TEST(array1,array2,tails,type) Array1      必需.第一个数据集. Array2      必需.第二个数据集. ...

  7. 使用pandas读取csv文件和写入文件

    这是我的CSV文件 读取其中得tempo这一列 import pandas as pd #导入pandas包 data = pd.read_csv("E:\\毕设\\情感识别\\Music- ...

  8. Python 应用领域及学习重点

    笔者认为不管学习什么编程语言,首先要知道:学完之后在未来能做些什么? 本文将浅谈 Python 的应用领域及其在对应领域的学习重点.也仅是介绍了 Python 应用领域的"冰山一角" ...

  9. win10安装docker,VSCode管理docker

    背景 docker:随着技术的不断迭代,开发环境的配置与部署越来越重要.Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...

  10. PHP函数:json_last_error

    json_last_error()  - 返回 JSON 编码解码时最后发生的错误.. 说明: json_last_error ( void ) : int 参数: 无 返回值: 返回一个整型(int ...