题目大意:

  (不说牛了)

  给出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. gitlab的添加密钥

    1.在本地电脑下载git的客户端并且安装 2.鼠标右键左面选中Git Bash Here 3.操作如下图生成密钥 4.将密钥复制过来添加到gitLab中 5.Eclipse配置密钥 6.在git创建的 ...

  2. Google Cloud SSH 连接配置

    设置当前用户及root用户的密码 sudo passwd xx-user # 输入新密码 sudo passwd root # 输入新密码(建议保持一样) 在本地生成私钥和公钥 cd ~/.ssh s ...

  3. 20.混合使用match和近似匹配实现召回率与精准度的平衡

    主要知识点: 召回率的慨念 精准度的慨念 match和近似匹配混合使用方法         召回率(recall):比如你搜索一个java spark,总共有100个doc,能返回多少个doc作为结果 ...

  4. Python - 面对对象(进阶)

    目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...

  5. 学习C语言偶遇【斐波那契数列】

    1.今天学着学着就发现一个特别有趣的数列,斐波那契数列,感觉很好玩,翠花,上代码~~~~~~~ #include <stdio.h> int fibonaci(int i) { ) { ; ...

  6. BZOJ 1724 USACO 2006 Nov. 切割木板

    倒过来的合并果子? 做法与合并果子一样 维护一个小根堆,每次取出最小的两个数进行合并 #include<cstdio> #include<algorithm> #include ...

  7. 《你说对就队》第八次团队作业:Alpha冲刺 第五天

    <你说对就队>第八次团队作业:Alpha冲刺 第五天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...

  8. Vue 安装教程

    1.下载node.js https://nodejs.org/en/ 2.检查环境变量: npm init (初始化项目) npm i webpack vue vue-loader 安装依赖: npm ...

  9. 费用最少的一款赛门铁克SSL证书

    Symantec Secure Site SSL证书,验证域名所有权和企业信息,属于Symantec Class 3企业(OV)验证 级SSL证书,为40位/56位/128/256位自适应加密,目前连 ...

  10. 【Codeforces 63C】Bulls and Cows

    [链接] 我是链接,点我呀:) [题意] 给你一个长度为4的数字序列(每个数字都在0~9之间,且不重复出现) 现在让你猜这个长度为4的序列是什么. 猜了之后对方会告诉有几个数字是位置和数字都正确的(猜 ...