转载:https://blog.csdn.net/xia842655187/article/details/51944763

区间选点的问题大致可以描述为: 
给定N个区间[a,b],取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以重复)。

关于贪心算法的验证过程就不再赘述,现在思考一下贪心策略的制定。 
对于区间[a1, b1] 、[a2, b2]、 [a3, b3] 来说, 
如果想选择最少的点,那么必须选择每个区间的右端点,示意图如下:

当你每一次都选择区间的最右端,才能保证每一个选的点覆盖的范围都是最广泛的,也就是说选的点才是最少的。

和之前不相交区间的思考方法类似,把区间进行预处理,按照端点的大小排序(同样,按照右端点排序会好理解一点,但是左端点排序一样可以起到作用,初学者不必迷信右端点排序)。 
预处理过后,求解策略的思路和求不相交区间相似,如果下一个区间的左端点不被覆盖,则答案+1,如下:

while(剩余区间的数目不为0)
{if(找到符合条件的下一个区间){当前区间 = 下一个区间;答案数+1;}区间数--;
}

代码:

#include<iostream>
#include<algorithm>
using namespace std;const int maxn=20;struct timetable
{int a;int b;
}time[maxn];bool comp(timetable &x,timetable &y)//多看两遍
{if(x.b!=y.b)return (x.b<y.b);return (x.a<y.a);
}int main()
{int i,n,count;while(cin>>n){count=1;for(i=0;i<n;i++)//输入 {cin>>time[i].a;cin>>time[i].b;}sort(time,time+n,comp);//按b从小到大排序int newend=time[0].b;cout<<"("<<time[0].a<<","<<time[0].b<<")"<<"  "; //第一个必然是 for(i=1;i<n;i++){if(newend<time[i].a){count++;newend=time[i].b;cout<<"("<<time[i].a<<","<<time[i].b<<")"<<"  ";}   }cout<<endl<<count<<endl;     }return 0;
} 

题目描述 
家住非洲的小孩,都很黑。为什么呢? 
第一,他们地处热带,太阳辐射严重。 
第二,他们不经常洗澡。(常年缺水,怎么洗澡。) 
现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间有木有!!(这也是没有的办法,缺水啊!!) 
每个小孩有一个时间段能够洗澡。并且,他们是可以一起洗的(不管你是男孩是女孩)。 
那么,什么时间洗澡,谁应该来洗,由谁决定的呢?那必然是他们伟大的“澡”神啊。“澡”神有一个时间表,记录着该部落的小孩,什么时候段可以洗澡。现在,“澡”神要问你,一天内,他需要最少开启和关闭多少次洗澡的水龙头呢?因为,开启和关闭一次水龙头是非常的费力气的,即便,这也是瞬间完成的。

输入 
多组数据 
第一行一个n<=100。 
接下来n行,每行一个时间段。H1H1:M1M1-H2H2:M2M2,24小时制。 
保证该时间段是在一天之内的。但是,不保证,H1H1:M1M1先于H2H2:M2M2。

输出 
题目描述,“澡”神最少需要开启和关闭多少次水龙头呢?

样例输入 

00:12-12:12 

00:12-12:12 
14:00-12:00

样例输出 

1

提示 
Ps:开启和关闭为一次


这道题是完美的区间选点,但是数据有坑(不保证H1H1:M1M1先于H2H2:M2M2。) 所以读入的时候要注意进行判断。

解决代码如下:

/*
************************************Title: NYOJ1036-非洲小孩
************************************Date:2015/07/23
************************************author:刘旭
************************************
Memory:256KB
Time:8ms
************************************
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define MAX 1005struct Node
{int x;int y;
};Node map[MAX];bool cmp(Node a,Node b){if(a.y != b.y){return a.y < b.y;}return a.x < b.x;
}int main()
{int num = 0;while(EOF != scanf("%d", &num)){memset(map, -1, sizeof(map));int a1,b1,a2,b2;for(int i = 0; i < num; i++){scanf("%d:%d-%d:%d",&a1,&b1,&a2,&b2);int key1 = a1*60+b1;int key2 = a2*60+b2;if(key1 > key2){swap(key1, key2);}map[i].x = key1;map[i].y = key2;}sort(map, map+num, cmp);int start = map[0].y;int num_node = 0;int ans = 1;while(num - num_node){if(map[num_node].x > start){start = map[num_node].y;ans++;}num_node++;}printf("%d\n", ans);}return 0;
}

贪心算法——区间选点问题相关推荐

  1. 贪心算法-区间选点问题-种树

    [题目描述]一条街道的一边有几座房子.因为环保原因居民想要在路边种些树,路边的地区被分割成n块,并被编号为1~n.每块大小为一个单位尺寸且最多可总一棵树.每个居民想在门前种些树并制定了三个数b,e,t ...

  2. 贪心法——区间选点问题

    贪心法--区间选点问题 区间选点问题.数轴上有nn个闭区间[ai,bi][a_i, b_i].取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个). 贪心思想:先按bb从小到大进 ...

  3. 贪心算法—区间调度 电影节(POJ 4151)

    贪心算法--区间选取问题 或是区间调度问题 本文解决一个很经典的贪心算法问题 Interval Scheduling(区间调度问题).给你很多形如[start,end]的闭区间,请你设计一个算法,算出 ...

  4. 一份贪心算法区间调度问题解法攻略,拿走不谢

    作者 | labuladong 来源 | labuladong(ID:labuladong) [导读]什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多 ...

  5. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  6. 贪心算法区间调度问题思路代码证明

    1.活动安排问题 问题:有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 解题思路:将活动按照结束时间进行从小到大排序,挑选出结束时间尽量 ...

  7. matlab车辆贪心作业调度,贪心算法-区间调度-Interval Scheduling

    什么是贪心算法呢? 贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高. 比如说一个算法问题使用暴力解法需要指数级时间,如果 ...

  8. NYOJ 287 Radar 贪心之 区间选点

    Radar 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Assume the coasting is an infinite straight line. Land ...

  9. 【48. 贪心(区间选点)】

    区间选点与最大不相交区间数量代码一样 思路 将每个区间按照右端点从小到大进行排序 从前往后枚举区间,end值初始化为无穷小 如果本次区间不能覆盖掉上次区间的右端点, ed < range[i]. ...

最新文章

  1. 编程自动化,未来机器人将超越人类?
  2. shell 使用数组作为函数参数的方法
  3. 5.8 程序示例--线性分类-机器学习笔记-斯坦福吴恩达教授
  4. hdu4027Can you answer these queries?
  5. 【Java】利用for循环打印心型
  6. 基本排序算法[python实现]
  7. 腾讯广告算法大赛 | 第三周周冠军心得分享
  8. ef 连接localdb_如何连接和使用Microsoft SQL Server Express LocalDB
  9. 构建一个简单的卷积神经网络,使用DRL框架tianshou匹配DQN算法
  10. 2013蓝桥杯C++B:错误票据
  11. python设置二维列表_Python设置为列表
  12. logback日志框架的简单使用
  13. mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...
  14. DotNetNuke 中文乱码问题的解决
  15. win10搭建无盘服务器配置,win10电脑搭建无盘工作站
  16. BigGAN高保真自然图像合成的大规模GAN训练
  17. java简历模板免费下载word格式_个人简历模板下载即用word版.doc
  18. 熊猫直播显示连接服务器失败,熊猫直播提示加载失败,请按“菜单键”刷新解决办法...
  19. mysql 民族_56个民族及民族代码的sql语句
  20. 简化预测集合的永磁同步电机的无差拍预测转矩控制系统Simulink仿真

热门文章

  1. 2022-2028全球与中国员工时间管理系统市场现状及未来发展趋势
  2. 把图片压缩成指定大小,释放你的内存空间
  3. 《沉默的大多数》阅读笔记优秀范文2200字
  4. [设计模式] IMPL 模式
  5. Unity基础篇:Serializable总结与深入研究。
  6. Adbee 出海公司介绍
  7. alert弹出[object Object]解决方法
  8. 安装包制作工具NSIS (NullSoft Scriptable Install System)
  9. C/C++ 数据范围int
  10. 简单的运动模糊效果实现