poj2376 Cleaning Shifts 区间贪心
题目大意:
(不说牛了)
给出n个区间,选出个数最少的区间来覆盖区间[1,t]。n,t都是给出的。
题目中默认情况是[1,x],[x+1,t]也是可以的。也就是两个相邻的区间之间可以是小区间的右端与大区间的左端相差1。这个是看题解才知道的。
解题思路:
贪心题的关键是找到贪心策略。但是这题的贪心策略没那么明显。并且贪心策略没有特定地去选择某一区间。这一题最重要的是要知道在什么情况下才需要增加一个区间。
首先是进行排序,按照区间的左端从小到大排序,左端相同的按照右端从小到大排。
从头开始遍历(只能是一重循环,不然要超时了)。当遍历到于第i个区间[xi,yi]时,做下面的事情:
1、设e为当前所有已经选择的区间的最右端。如果xi<=e+1,那么就代表这个区间很可能被选择。当然这样的区间可能有很多,所以我们需要去找最优的区间。
2、在满足1的条件下,也就是xi<=e+1。设b为遍历过的所有区间的右端的最大值。如果i区间的右端点yi>b,就把b更新为yi。用一个flag来标记b是否更新过。所以这时候可以用flag=1来标记b更新过了。b有没有更新过有什么区别呢?b没有更新,代表这i区间一定不会被选择。
3、在flag的值没有改变的前提下,查看一下第i+1和区间的左端点xi+1是否大于e+1。是大于的话,代表着被选择的区间数需要增加一个。因为不选择i区间就会产生断层。然后再把e更新为b,flag标记为0。这样做的话,需要自己增加一个区间,使得左端点大于题目中设定的T。
“被选择的区间需要增加一个”,不代表i区间一定被选择,也可能是它前面的区间被选择。
例如:
这一组数据
8 14
1 2
1 3
2 3
2 10
3 9
5 7
8 11
11 14
遍历到3 9这一区间,e=3,b=10,cnt=1。cnt是选择的区间数。发现下一组数据的左端点5,已经大于e+1。所以x需要+1。但是我们会发现被选择的区间不是[3,9],应该是[2,10]。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N=;
pair<int,int> s[N];
int main()
{
//freopen("test.txt","r",stdin);
int n,i,t;
while(scanf("%d%d",&n,&t)!=EOF){
for(i=;i<n;i++)
scanf("%d%d",&s[i].first,&s[i].second);
sort(s,s+n);
int e=,b=,x=;
bool flag=;
s[n].first=0x3f3f3f3f;
for(i=;i<n;i++)
{
if(s[i].first<=e+)
{
if(b<s[i].second) b=s[i].second,flag=;
if(s[i+].first>e+&&flag)
{
e=b;
x++;
flag=;
}
}
//printf("%d %d %d %d %d %d\n",s[i].first,s[i].second,e,b,flag,x);
}
if(e<t) printf("-1\n");
else printf("%d\n",x);
}
return ;
}
poj2376 Cleaning Shifts 区间贪心的更多相关文章
- POJ2376 Cleaning Shifts 【贪心】
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11542 Accepted: 3004 ...
- POJ2376 Cleaning Shifts
题意 POJ2376 Cleaning Shifts 0x50「动态规划」例题 http://bailian.openjudge.cn/practice/2376 总时间限制: 1000ms 内存限制 ...
- 【POJ - 2376】Cleaning Shifts(贪心)
Cleaning Shifts Descriptions: 原文是English,我这就直接上Chinese了,想看原文的点一下链接哦 大表哥分配 N (1 <= N <= 25,000) ...
- poj 3171 Cleaning Shifts(区间的最小覆盖价值)
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2743 Accepted: 955 De ...
- poj2376 Cleaning Shifts【线段树】【DP】
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32561 Accepted: 7972 ...
- poj2376 Cleaning Shifts(区间贪心,理解题意)
https://vjudge.net/problem/POJ-2376 题意理解错了!!真是要仔细看题啊!! 看了poj的discuss才发现,如果前一头牛截止到3,那么下一头牛可以从4开始!!! # ...
- poj-2376 Cleaning Shifts (排序+贪心)
http://poj.org/problem?id=2376 john有n头牛做打扫工作,他想在t时间内每个时间都至少有一头牛在做打扫工作,第一头牛在1,最后一头牛在t时间,每一头牛工作都有一个开始时 ...
- poj 2376 Cleaning Shifts(贪心)
Description Farmer John <= N <= ,) cows to <= T <= ,,), the first being shift and the la ...
- ACM学习历程——POJ 2376 Cleaning Shifts(贪心)
Description Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning ...
随机推荐
- 理解Mysql prepare预处理语句
MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势.候选界面包括MySQL C API客 ...
- Linux:文本处理工具
闲话少说,列出工具: ========================这些是查看文本用的=========================== 1,cat 用法:cat >f1 直接创建或覆盖 ...
- 如何利用showdoc自动生成API文档
介绍 showdoc是一个适合IT团队的文档工具,阅读本文前需要对showdoc有基本了解 .基本介绍可看:https://www.showdoc.cc/help 对于写API文档这件事,虽然说文本编 ...
- python爬虫20 | 小帅b教你如何使用python识别图片验证码
当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...
- debian 7 安装
1. 从 live cd 或者 dvd 进行安装,官方文档已经够用,可以将 live cd 写进 u 盘,也可以将 dvd 放到硬盘上通过 grub 引导启动安装,文档在这里. 2.安装过程中尽量选择 ...
- BZOJ 2501 [usaco2010 Oct]Soda Machine
[题意概述] 给出一个[0,1,000,000,000]的整数数轴,刚开始每个位置都为0,有n个区间加操作,最后询问数轴上最大的数是多少. [题解] 我写的是离散化后线段树维护区间最值. 其实貌似不用 ...
- sql server的 between and 日期问题
- ansible使用jinja2管理配置文件以及jinja2语法简介
一.Jinja2介绍 Jinja2是基于python的模板引擎,功能比较类似于PHP的smarty,J2ee的Freemarker和velocity.它能完全支持unicode,并具有集成的沙箱执行环 ...
- 磁盘阵列 RAID 技术原理详解
RAID一页通整理所有RAID技术.原理并配合相应RAID图解,给所有存储新人提供一个迅速学习.理解RAID技术的网上资源库,本文将持续更新,欢迎大家补充及投稿.中国存储网一如既往为广大存储界朋友提供 ...
- 洛谷 P4198 BZOJ 2957 楼房重建
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...