算法-贪心
1.C++内存四区2.算法-排序-快速排序3.算法-排序-归并排序4.c++重载5.算法-二分6.算法—前缀和7.算法—差分8.算法-双指针9.c++引用10.c++函数默认参数及占位参数11.c++函数模板12.c++类和对象-封装13.struct和class的区别14.成员属性设置为私有15.C++类和对象-对象特性(1)16.C++类和对象-对象特性(2)17.N皇后18.动态规划dp-01背包问题19.C++类和对象-对象特性(4)20.C++类和对象-对象特性(3)21.C++友元22.C++运算符重载23.C++继承24.C++多态25.C++类模板26.C++vector容器27.C++string容器28.C++deque容器29.算法-树状数组30.算法线段树31.算法-bfs
32.算法-贪心
33.算法-Flood Fill34.数据结构-链表35.数据结构-栈36.数据结构-队列37.P2678 跳石头38.5132139.54440.3213241.牛客寒假算法集训1-总结42.牛客寒假算法集训2-总结43.牛客寒假算法集训3-总结44.数论-质数45.博弈论46.第十四届蓝桥杯省赛C++题解47.Trie树48.并查集49.数据结构-堆50.哈希表51.拓扑排序52.Dijkstra53.spfa54.数论-约数55.数论-欧拉函数56.图的存储和遍历57.牛客寒假算法集训4-总结58.牛客寒假算法集训5-总结59.牛客寒假算法集训6-总结60.Bellman_ford61.Floyd62.编辑距离63.数位dp核心:局部最优->全局最优
例1:AcWing 905. 区间选点
思路:
1.将每一个区间右端点排序
2.枚举每一个区间,如果当前区间包含点,则之间pass,otherwise选择当前区间右端点
证明:
这里使用夹逼定理进行证明,后面的最大不相交区间和区间分组都是用的这个方式
Ans<=cnt证明:
因为Ans表示的是最优解,即所用点数最少;而cnt只是求出了一个合法解,合法解的点数必然小于等于最优解
Ams>=cnt证明:
根据y总当时的贪心策略,当前区间不包含点时我们会选择它的右端点作为最终解中的一个点,因为选择的是右端点且区间是按右端点从小到大排序的,所以当前不包含点的区间与上一个选了右端点的区间,两者之间必然不存在交集;由此,这cnt个选择了右端点作为最终解的区间彼此之间必然不存在交集,即所有区间中至少存在cnt个彼此不相交的区间;如此,要想让选出的点覆盖所有区间,至少需要选cnt个点,即任何一个方案都至少包含cnt个点,最优解也不例外;Ans>=cnt得证
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,INF=-2e9;
struct hh
{
int l,r;//左右端点
}a[N];
bool cmp(hh a,hh b)
{
return a.r<b.r;
}
int n,cnt;
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i].l>>a[i].r;
sort(a,a+n,cmp);//区间右端点排序
int end=INF;//初始化
for(int i=0;i<n;i++)//枚举区间
if(a[i].l>end)
{
cnt++;
end=a[i].r;//更新右端点
}
cout<<cnt<<endl;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析