1. 选择不相交区间
数轴上有n个开区间 ( a i , b i ) (a_i, b_i) (ai​,bi​)。选择尽量多个区间,使得这些区间没有公共点。

这是最简单的区间问题,很多区间问题都需要先排序,要么对 a i a_i ai​排序,要么对 b i b_i bi​排序。这道题直接将区间按照 b i b_i bi​排序,第一个区间一定要选择,然后选择下一个符合条件的区间(不与第一个区间重叠),以此类推。

数据(5,7), (1,2), (4,6), (4,5), (0,3), (3,7), (8,10), (9,15), (16,17)。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int,int>> data {{5,7}, {1,2}, {4,6}, {4,5}, {0,3}, {3,7}, {8,10}, {9,15}, {16,17}};bool cmp(pair<int, int> a, pair<int, int> b)
{return a.second < b.second;
}int main()
{vector<pair<int,int>> ans;sort(data.begin(), data.end(), cmp);ans.push_back(data.front());for(int i = 1;i < data.size(); i++)if(data[i].first >= ans.back().second)ans.push_back(data[i]);for(int i = 0; i < ans.size(); i++)cout<<"("<<ans[i].first<<", "<<ans[i].second<<"), ";cout<<endl;return 0;
}

2. 区间选点问题
数轴上有n个闭区间 [ a i , b i ] [a_i, b_i] [ai​,bi​]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

首先考虑如果两个区间包含,小区间内的点一定在大区间内,大区间内的点不一定在小区间内。所以遇到包含区间,只考虑小区间就可以了。当两个区间不包含但有重叠部分,选择一个点在 b i b_i bi​更小的区间的最末端,则该点一定包含在两个区间内。

同样按 b i b_i bi​排序所有点,当 b i b_i bi​相同时 a i a_i ai​从大到小排序。这样排序以后即使有包含区间,小区间也会排在前面。接下来取第一个区间的最后一个点,然后向后查找第一个不包含该点的区间,取该区间的最后一个点,以此类推直到结束。

相同的数据(5,7), (1,2), (4,6), (4,5), (0,3), (3,7), (8,10), (9,15), (16,17)。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int,int>> data {{5,7}, {1,2}, {4,6}, {4,5}, {0,3}, {3,7}, {8,10}, {9,15}, {16,17}};bool cmp(pair<int, int> a, pair<int, int> b)
{return a.second < b.second || (a.second == b.second && a.first > b.first);
}int main()
{if(data.size() == 0) return -1;vector<int> ans;sort(data.begin(), data.end(), cmp);int current = data.front().second;ans.push_back(current);for(int i = 1; i < data.size(); i++)if(data[i].first > ans.back()){current = data[i].second;ans.push_back(current);}for(int i = 0; i < ans.size(); i++)cout<<ans[i]<<", ";cout<<endl;
}

3.区间覆盖问题
数轴上有n个闭区间 [ a i , b i ] [a_i,b_i] [ai​,bi​],选择尽量少的区间覆盖一条指定线段 [ s , t ] [s,t] [s,t]。当两个区间的起始点都比s小,应当选择两条线段里 b i b_i bi​更大的区间,这样同一条线段可以覆盖更长距离。假设选择了线段 3 ( a 3 , b 3 ) 3(a_3,b_3) 3(a3​,b3​),接下来只需要考虑待覆盖线段的 [ b 3 , t ] [b_3, t] [b3​,t]部分,找到 a i < b 3 a_i<b_3 ai​<b3​且 b i b_i bi​最大的区间覆盖线段,一直到 [ s , t ] [s,t] [s,t]全部被覆盖。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;vector<pair<int,int>> data {{5,7}, {1,2}, {3,4}, {4,5}, {0,3}, {3,7}, {6,9}, {8,13}, {16,17}};
pair<int, int> line {4,12};bool cmp(pair<int, int> a, pair<int, int> b)
{return a.first < b.first;
}int main()
{vector<pair<int, int>> ans;int End = line.first, index;sort(data.begin(), data.end(), cmp);for(int i = 0; i < data.size(); i++){ if(data[i].first <= line.first)while(i < data.size() && data[i].first <= line.first){if(data[i].second > End){End = data[i].second;index=i;}i++;}else {cout<<"Impossible to cover!"; return -1;}ans.push_back(data[index]);if(End >= line.second) break;line.first = End;i--;}for(int i = 0; i < ans.size(); i++)cout<<"("<<ans[i].first<<", "<<ans[i].second<<"), ";return 0;
}

简单区间问题 选择不相交区间 区间选点 区间覆盖问题解答及代码 C++相关推荐

  1. 贪心法——选择不相交区间

    贪心法--选择不相交区间 选择不相交区间.数轴上有nn个开区间(ai,bi)(a_i, b_i).选择尽量多个区间,使得这些区间两两没有公共点. 贪心思路:按b<script id=" ...

  2. P1803 凌乱的yyy / 线段覆盖(选择不相交区间,贪心)

    题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...

  3. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...

  4. 选择不相交区间(贪心算法) By ACReaper

    题目的分析被说得有点绕.自己理解是这样,首先由题目我们知道选择的区间都是相互不相交的,除这之外,我们的目标是尽量的让选择的区间达到最大化. 所以我们可以先对齐排序,因为输入是随机的.假设每个区间表示为 ...

  5. 选择不相交区间(贪心:求不相交区间最多个数)

    选择不相交区间(转) 数轴上有n个区间[ai,bi],要求选择尽量多个区间,使得这些区间两两没有公共点. 贪心策略: 按照b1<=b2<=b3-的方式排序,然后从前向后遍历,每当遇到可以加 ...

  6. 动态分区分配算法代码_【代码】巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法...

    分享代码:巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法. 说明:该代码基于Matlab2012a及Intlab5.5编写,对应文献:"Dunwei Gong, B ...

  7. java区间合并_贪心算法:合并区间

    ❝ 最近文章阅读量少了很多啊打卡也少了, 是不是年底了很多录友在忙期末考试啊,哈哈. 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: intervals = [[1,3],[2,6], ...

  8. 台式计算机机箱都一样吗,别以为组装台式机很简单,机箱选择大有学问

    原标题:别以为组装台式机很简单,机箱选择大有学问 曾经组装台式机的时候对于机箱完全没有在意,总觉得随便选择一款就可以了, 而且是挑便宜的选择,而那些机箱有便宜也有贵,其实里面的设计完全不一样,还有使用 ...

  9. 小灰灰的APP学习之路(三)--创建一个简单的问答选择项目

    创建一个简单的问答选择项目 简介 这是一个简单的问答选择项目,界面上显示问题,然后点击"正确"或"错误"按钮,系统给出是否回答正确的提示. 例如: 问题:1+1 ...

最新文章

  1. 阻止应用继承的NTFS权限
  2. 获取Java接口的所有实现类
  3. callbackend entry point - iwfndcl_mgw_request_manager~read_entity
  4. 利用numpy删除DataFrame某一行/列、多行内容
  5. Java函数编码_转[收集java的常用函数代码]
  6. 高考成绩查询2021年莆田市,2021年莆田高考志愿填报系统入口
  7. CREATE VIEW SQL:在SQL Server中使用索引视图
  8. java的程序控制关键字_Java编程的关键字有哪些
  9. Android全局变量使用
  10. matlab 电路频率响应_电力电子模型频率响应估计
  11. 计算机维修5级,电脑芯片级维修教程
  12. 将一个链表分为奇偶两个链表
  13. 动漫,简史早期的日本动画
  14. CUDA+ GTX1050ti电脑配置
  15. 苹果侧边滑动返回_iOS系统右滑返回手势问题及解决方案
  16. 学习文档【超详细中文版】(小甲鱼视频)
  17. Vue入门(10)axios
  18. ssh 获取服务器文件命令,ssh读取服务器文件内容
  19. 非线性最小二乘法之Gauss Newton、L-M、Dog-Leg
  20. 如何给Centos系统的虚拟机更改主机名和用户名

热门文章

  1. Maya2017下载安装与激活
  2. 小灰灰的APP学习之路(二)--创建第一个Hello World项目
  3. 百度关键词霸屏之黑帽SEO
  4. Perl例程24例(包含很多运用示例-整理版)
  5. 数字电子技术课设--频率计
  6. echarts 3D折线图应用
  7. 智慧穿戴装置带动医疗大数据发展
  8. 用面包板搭建4bit加法器
  9. 《数字图像处理》冈萨雷斯matlab函数statmoments、计算均值和n阶中心矩,并返回行向量
  10. Java中常用的原子类