求不相交区间的最多个数
来源:互联网 发布:万网域名登录 编辑:程序博客网 时间:2024/06/06 06:56
数轴上有多个区间【ai,bi】,求不相交区间的最多个数。(贪心)
贪心策略:
按照b1<=b2<=b3…的方式排序,然后从前向后遍历,每当遇到可以加入集合的区间,就把它加入集合。(集合代表解的集合)
证明:
我们对a1,a2……的关系分以下几种情况考虑:
1、a1>a2。 此时区间2包含区间1。这种情况下显然不会选择区间2,因为选择区间1会留下更多的剩余空间。
不仅区间2如此,以后所有区间中只要有一个 i 满足a1 > ai,i 都不要选。
即此种情况下,选择区间1是明智的,与策略一致。
2、排除情况1后,一定有a1<=a2<=a3……。
在此条件下,如图所示,不论区间1、2的相对位置如何,选择区间1都会为以后的选择留下更大的剩余空间。典型例题:
hdu2037
题目大意:某人想要看电视,而每天的电视节目都在不同的时间段播出,给出一些节目的播出时间,求他一天内能看的最多的电视节目个数。
应用上述策略则可求解。
代码实现:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int main(){ int n; int a[110], b[110]; int s, e; while(~scanf("%d", &n)) { int cnt =1; if(n == 0) break; for(int i = 0; i<n; i++) { scanf("%d%d", &a[i], &b[i]); } for(int i = 0; i<n-1; i++) for(int j = i+1; j<n; j++) { if(b[j] < b[i]) { swap(b[i], b[j]); swap(a[i], a[j]); } } s = a[0]; e = b[0]; for(int i = 1; i<n; i++){ if(a[i] >= e){ cnt++;//for循环这部分容易写错,要注意当满足if条件以后cnt++,同时要将e赋成新的bi。 e = b[i]; } } printf("%d\n", cnt); // for(int i = 0; i<n; i++) // printf("%d %d\n", a[i], b[i]); } return 0;}
0 0
- 求不相交区间的最多个数
- 求最多不相交区间的个数
- HDU 4343 多查询求区间内的最大不相交区间个数-思维&贪心-卡时间&二分&剪枝
- HDU 2037 今年暑假不AC (贪心---求最多不相交区间问题)
- 区间相关问题的学习: 最多不相交区间问题,区间选点问题与区间覆盖问题
- 南阳168房间安排(最多不相交区间问题)
- hdu 3998 Sequence(DP+最大流,求最多的不相交路径)
- 求区间中1的个数最多的数 若有多个输出最小的
- Binary system(求区间内二进制中1的个数最多的数)
- 最多不相交线段
- !HDU 4293 排队分组说谎问题-dp-(不相交区间的最大个数)
- 求区间并的个数
- ural 1203. Scientific Conference(dp)给定N个区间,求最大的不相交的区间数
- HDU 2037 今年暑假不AC(贪心 最多不相交区间)
- ZOJ 1076 Gene Assembly (贪心求区间不相交问题)
- 8.4.4(选择不相交的区间)
- 选择尽可能多的不相交区间
- 选择不相交区间
- 【Yaf】Yaf的环境安装遇到的问题以及解决方案
- JavaScript入门:005—JS基本语句
- 反正切函数的应用
- Effective C++(一)让自己习惯C++
- hdu4780 高斯消元 及 非高斯消元
- 求不相交区间的最多个数
- hdu 2111 Saving HDU
- C语言 简述 和 编译
- 学习历程之HTML篇三
- 关于javascript函数中参数传递问题
- Effective C++(二)构造/析构/赋值运算
- poj1185 炮兵阵地(状态压缩+DP)
- linux内核模块的编译
- hexdump命令使用