线段覆盖问题
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!
5.线段覆盖问题
6.【算法学习】学换根dp有感7.二分图最大匹配8.【算法学习】01BFS9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树19.圆方树20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理29.【算法学习】欧拉函数φ30.【算法学习】二维转一维问题31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心1.线段不覆盖问题
给出 \(n\) 个线段,选择尽量多的线段使得选择的线段相互之间无重叠,问最多可以选多少条线段。
解析
考虑贪心,将线段按右端点从小到大排序,如果这条线段的左端点大于上一条线段的右端点那就选择这条线段。
为什么这么贪是对的呢,因为将右端点排序可以使右边剩余的空间尽量大,那么剩余的选择就可能会更大,而且每个线段对答案贡献都为一,我可以剩下更多的空间,我们价值都为一,那我为什么要给你(贪心真残酷,但就是弱肉强食)。
代码
#include<bits/stdc++.h> using namespace std; int n; struct ss{ int s,t;//s:开始,t:结束 }a[1000005]; bool cmp(ss g,ss h){ return g.t<h.t; } int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].s>>a[i].t; } sort(a+1,a+n+1,cmp); int last=0,ans=0;//last:上一个选择线段的右端点 for(int i=1;i<=n;i++){ if(last<=a[i].s){//因为不能重叠 ans++; last=a[i].t;//更新 } } cout<<ans; return 0; }
2.线段完全覆盖问题
题面
给定一个长度为 \(m\) 的区间,再给出 \(n\) 条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖。
解析
考虑贪心,将线段按左端点排序,用 \(ml\) 表示已选择的线段中右端点最右的点,用 \(mr\) 在左端点不超过 \(ml\) 时能遍历到的最右的端点,如果下一个点的左端点没有超过 \(ml\),我们就不断地找右端点最大的点(max(a[i].r , mr)),下一个点左端点超过 \(ml\) 的时候(因为如果不选出一个选段的话将会造成无法完全覆盖),我们就在遍历过的点里选用 \(mr\),然后将 \(ml\) 设为 \(mr\),答案数增加。
注意一些边界问题!!代码里有详写。
代码
#include<bits/stdc++.h> using namespace std; int n; struct ss{ int s,t; }a[1000005]; bool cmp(ss g,ss h){ if(g.s!=h.s){//要右端点也递增 return g.s<h.s; } else{ return g.t<h.t; } } int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].s>>a[i].t; } sort(a+1,a+n+1,cmp); int ml=b[1].t,mr=a[1].t,ans=0; a[n+1].s=1e8;//最后的线段要选 for(int i=1;i<=n;i++){ mr=max(mr,a[i].t); //选出最大右端点 if(a[i+1].s>ml){//如果不选出一个将会造成无法覆盖 ml=mr;//更新边界 ans++; } } cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)