简单区间问题 选择不相交区间 区间选点 区间覆盖问题解答及代码 C++
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++相关推荐
- 贪心法——选择不相交区间
贪心法--选择不相交区间 选择不相交区间.数轴上有nn个开区间(ai,bi)(a_i, b_i).选择尽量多个区间,使得这些区间两两没有公共点. 贪心思路:按b<script id=" ...
- P1803 凌乱的yyy / 线段覆盖(选择不相交区间,贪心)
题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...
- NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...
- 选择不相交区间(贪心算法) By ACReaper
题目的分析被说得有点绕.自己理解是这样,首先由题目我们知道选择的区间都是相互不相交的,除这之外,我们的目标是尽量的让选择的区间达到最大化. 所以我们可以先对齐排序,因为输入是随机的.假设每个区间表示为 ...
- 选择不相交区间(贪心:求不相交区间最多个数)
选择不相交区间(转) 数轴上有n个区间[ai,bi],要求选择尽量多个区间,使得这些区间两两没有公共点. 贪心策略: 按照b1<=b2<=b3-的方式排序,然后从前向后遍历,每当遇到可以加 ...
- 动态分区分配算法代码_【代码】巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法...
分享代码:巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法. 说明:该代码基于Matlab2012a及Intlab5.5编写,对应文献:"Dunwei Gong, B ...
- java区间合并_贪心算法:合并区间
❝ 最近文章阅读量少了很多啊打卡也少了, 是不是年底了很多录友在忙期末考试啊,哈哈. 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: intervals = [[1,3],[2,6], ...
- 台式计算机机箱都一样吗,别以为组装台式机很简单,机箱选择大有学问
原标题:别以为组装台式机很简单,机箱选择大有学问 曾经组装台式机的时候对于机箱完全没有在意,总觉得随便选择一款就可以了, 而且是挑便宜的选择,而那些机箱有便宜也有贵,其实里面的设计完全不一样,还有使用 ...
- 小灰灰的APP学习之路(三)--创建一个简单的问答选择项目
创建一个简单的问答选择项目 简介 这是一个简单的问答选择项目,界面上显示问题,然后点击"正确"或"错误"按钮,系统给出是否回答正确的提示. 例如: 问题:1+1 ...
最新文章
- 阻止应用继承的NTFS权限
- 获取Java接口的所有实现类
- callbackend entry point - iwfndcl_mgw_request_manager~read_entity
- 利用numpy删除DataFrame某一行/列、多行内容
- Java函数编码_转[收集java的常用函数代码]
- 高考成绩查询2021年莆田市,2021年莆田高考志愿填报系统入口
- CREATE VIEW SQL:在SQL Server中使用索引视图
- java的程序控制关键字_Java编程的关键字有哪些
- Android全局变量使用
- matlab 电路频率响应_电力电子模型频率响应估计
- 计算机维修5级,电脑芯片级维修教程
- 将一个链表分为奇偶两个链表
- 动漫,简史早期的日本动画
- CUDA+ GTX1050ti电脑配置
- 苹果侧边滑动返回_iOS系统右滑返回手势问题及解决方案
- 学习文档【超详细中文版】(小甲鱼视频)
- Vue入门(10)axios
- ssh 获取服务器文件命令,ssh读取服务器文件内容
- 非线性最小二乘法之Gauss Newton、L-M、Dog-Leg
- 如何给Centos系统的虚拟机更改主机名和用户名