POJ2376Cleaning Shifts(区间覆盖贪心)
应该还是蛮简单的一题,但是因为模拟太差,一直没调出来.......
\(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\)。
\(那么第一个区间的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(区间覆盖贪心)的更多相关文章
- codeforces Gym 100187F F - Doomsday 区间覆盖贪心
F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ...
- UVa 10382 Watering Grass (区间覆盖贪心问题+数学)
题意:有一块长为l,宽为w的草地,在其中心线有n个喷水装置,每个装置可喷出以p为中心以r为半径的圆, 选择尽量少的装置,把草地全部润湿. 析:我个去啊,做的真恶心,看起来很简单,实际上有n多个坑啊,首 ...
- POJ 2376 Cleaning Shifts 区间覆盖问题
http://poj.org/problem?id=2376 题目大意: 给你一些区间的起点和终点,让你用最小的区间覆盖一个大的区间. 思路: 贪心,按区间的起点找满足条件的并且终点尽量大的. 一开始 ...
- POJ 2376 Cleaning Shifts (贪心,区间覆盖)
题意:给定1-m的区间,然后给定n个小区间,用最少的小区间去覆盖1-m的区间,覆盖不了,输出-1. 析:一看就知道是贪心算法的区间覆盖,主要贪心策略是把左端点排序,如果左端点大于1无解,然后, 忽略小 ...
- 高效算法——E - 贪心-- 区间覆盖
E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...
- 贪心算法----区间覆盖问题(POJ2376)
题目: 题目的大概意思是约翰这个农民有N条牛,这些牛可以在一天中的某个时间段可以进行工作,他想把这个时间段分成若干个片段让这些牛去进行打扫任务,你的任务是安排尽量少的牛然后可以完成分成这些片段的打扫任 ...
- UVA 10382 Watering Grass(区间覆盖,贪心)题解
题意:有一块草坪,这块草坪长l 米,宽 w 米,草坪有一些喷头,每个喷头在横坐标为 p 处,每个喷头的纵坐标都是(w/2) ,并且喷头的洒水范围是一个以喷头为圆心,半径为 r 米的圆.每次最少需要打开 ...
- 贪心问题:区间覆盖 POJ 1328 Rader Installation
题目:http://poj.org/problem?id=1328 题意:给定海岛个数,雷达半径,输入各个海岛坐标,求能覆盖所有海岛的最少雷达数 题解: 1. 贪心的区间覆盖问题,尽量让每个雷达覆盖更 ...
- 贪心问题:区间覆盖 NYOJ 喷水装置(二)
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水 ...
随机推荐
- 【python实现卷积神经网络】激活层实现
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- AJ学IOS 之CoreLocation地理编码小Demo输入城市得到经纬度
AJ分享,必须精品 一:效果 输入地名,可以得到相应的经纬度,知识为了学习写的小Demo 二:实现步骤 一 :首先获取用户输入的位置. 二 :创建地理编码对象. 三 :利用地理编码对象编码,根据传入的 ...
- Android调用系统设置
最近,弄了一下,调用系统设置的方法,Android4.0的系统,下面的所有设置项,都亲测可以调用.首先调用的方式如下: Intent mintent_setting_time = new Intent ...
- pytorch cheatsheet
- shiro:入门程序(一)
SpringMVC项目 1:pom引入相关依赖 <dependencies> <!--测试依赖--> <dependency> <groupId>jun ...
- Java中Character类
Character 类在对象中包装一个基本类型char的值此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等),并将字符从大写转小写,反之亦然. 构造方法: Character(char ...
- 加不加 synchronized 有什么区别?
今天一起来认识认识 synchronized 这个一面试就会被提到的关键字.这一篇不会讲太多理论,主要先熟悉熟悉一下最简单的用法.只讨论一个问题:方法没用 synchronized 和用了 synch ...
- JDBC 工具类封装
每次使用jdbc 我们都要 加载驱动类 创建链接 创建Statement 接口对象执行sql 关闭资源 按照这样的套路可以封装一些重用代码方便在其他方法中调用 package com.xzlf.jdb ...
- liunx系统二进制包安装编译mysql数据库
liunx系统二进制包安装编译mysql数据库 # 解压二进制压缩包 [root@localhost ~]# tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C ...
- Linux查看端口或pid使用路径
1. lsof -i:10010 查看10010端口的占用情况 命令返回结果: 2. netstat -lpn | grep 80 查看80端口服务端socket占用状况 3. ll /proc/26 ...