题目大意:

  (不说牛了)

  给出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 区间贪心的更多相关文章

  1. POJ2376 Cleaning Shifts 【贪心】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11542   Accepted: 3004 ...

  2. POJ2376 Cleaning Shifts

    题意 POJ2376 Cleaning Shifts 0x50「动态规划」例题 http://bailian.openjudge.cn/practice/2376 总时间限制: 1000ms 内存限制 ...

  3. 【POJ - 2376】Cleaning Shifts(贪心)

    Cleaning Shifts Descriptions: 原文是English,我这就直接上Chinese了,想看原文的点一下链接哦 大表哥分配 N (1 <= N <= 25,000) ...

  4. poj 3171 Cleaning Shifts(区间的最小覆盖价值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2743   Accepted: 955 De ...

  5. poj2376 Cleaning Shifts【线段树】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32561   Accepted: 7972 ...

  6. poj2376 Cleaning Shifts(区间贪心,理解题意)

    https://vjudge.net/problem/POJ-2376 题意理解错了!!真是要仔细看题啊!! 看了poj的discuss才发现,如果前一头牛截止到3,那么下一头牛可以从4开始!!! # ...

  7. poj-2376 Cleaning Shifts (排序+贪心)

    http://poj.org/problem?id=2376 john有n头牛做打扫工作,他想在t时间内每个时间都至少有一头牛在做打扫工作,第一头牛在1,最后一头牛在t时间,每一头牛工作都有一个开始时 ...

  8. poj 2376 Cleaning Shifts(贪心)

    Description Farmer John <= N <= ,) cows to <= T <= ,,), the first being shift and the la ...

  9. ACM学习历程——POJ 2376 Cleaning Shifts(贪心)

    Description Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning ...

随机推荐

  1. 使用Python的Flask框架,结合Highchart,动态渲染图表(Ajax 请求数据接口)

    参考链接:https://www.highcharts.com.cn/docs/ajax 参考链接中的示例代码是使用php写的,这里改用python写. 需要注意的地方: 1.接口返回的数据格式,这个 ...

  2. 00106_UDP通信

    1.DatagramPacket (1)JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据: (2)在创建发送端和接收端的Dat ...

  3. Python网络请求urllib和urllib3详解

    Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urlli ...

  4. 玲珑杯1147 - 最后你还是AK了

    1147 - 最后你还是AK了 Time Limit:5s Memory Limit:256MByte DESCRIPTION 今天HHHH遇到了一颗树,这个树有nn个点(nn为偶数),每条边都有一个 ...

  5. 传染病控制(洛谷 1041 WA 90)

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  6. Flume基本概念

    1         Apache Flume 1.1         概述 Flume是Cloudera提供的一个高可用,高可靠的,分布式的海量日志采集.聚合和传输的软件. Flume的核心是把数据从 ...

  7. [bzoj2599][IOI2011]Race_树上点分治

    Race bzoj-2599 题目大意:询问一颗树上最短的.长度为k的链,边有边权,n个节点. 注释:$1\le n \le 2\cdot 10^5$,$1\le k \le 10^6$. 想法:树上 ...

  8. 翻翻git之---溜的飞起的载入效果AVLoadingIndicatorView

    转载请注明出处:王亟亟的大牛之路 由于接近过春节.看各个群体的工作都不太旺盛(不是年会就是各种吹B或是放空). 之前的Material Design的内容差点儿讲的差点儿相同了(至少基本的几个控件都介 ...

  9. Python爬虫抓取csdn博客

    昨天晚上为了下载保存某位csdn大牛的所有博文,写了一个爬虫来自己主动抓取文章并保存到txt文本,当然也能够 保存到html网页中. 这样就能够不用Ctrl+C 和Ctrl+V了,很方便.抓取别的站点 ...

  10. HTML导航 - 点击更改背景

    步骤一: 在须要添加效果的<li>标签中添加onclick事件:<li onclick="setcurrent(this)"> 步骤二: 加入JS代码: f ...