贪心算法笔记
贪心算法笔记
大概内容
贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种
- 看时间复杂度,一般的就是 O ( n ) O(n) O(n) 或者是排序 O ( n l o g n ) O(n \ log n) O(n logn)
- 或者猜测,看着像就可以试试。
- 自己用数学证明方法,比如归纳法,交换法,就是如果交换之后答案变得小或者大就可以了。
那贪心在比赛中怎么办呢?可以先尝试一下大小样例,再尝试对拍,有个保底,如果可以也可以证明一下。
然后还有一种贪心,叫做反悔贪心,就是可以撤销,也没别的。
最后因为贪心每次取局部最优,所以代码不长,而且时间复杂度不大。
例题讲解
凌乱的yyy / 线段覆盖
题目大意:有 n n n 个线段,问最多有多少个不重叠的线段。
思路:贪心,然后按照 r i r_{i} ri 排序,每次选取尽可能早的场次并且要合法,也就是不能前面重叠。
证明:如果不相交,那么图片如下。

很明显,一场弄完,另一场。如果包含,图片如下:

那样我们就可以选择第一场,因为它结束得早,可以取另外的场次。所以证明取更早的是永远比更晚的要更优。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
#include<bits/stdc++.h>
struct noip//有同学不会结构体的多开几个数组
{int begin;//开始时间 int finish;//结束时间
}a[2000005];
bool cmp(noip x,noip y)
{return x.finish<y.finish;//按结束时间排
}
using namespace std;
int main()
{int n,ans=1;//初始化 cin>>n; for(int i=1;i<=n;i++){cin>>a[i].begin>>a[i].finish;}sort(a+1,a+n+1,cmp);//快速排序(不用我多说了吧) int mini=a[1].finish;//定义mini统计最后结束时间 int j=1;while(j<=n)//我用了while,感兴趣的同学可以用for(提示:for不用定义j) {j++;if(a[j].begin>=mini)//新的比赛开始时间要晚于mini {ans++;//统计比赛数 mini=a[j].finish;//更新mini }}cout<<ans<<endl;//输出 return 0;//功德圆满
}
Teleporters (Easy Version)
思路:直接 a i + i a_{i}+i ai+i 排序,就好了。
证明:就是每次都是走过去,传回来,所以直接排序就可以了。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
#include<bits/stdc++.h>
using namespace std;
struct node
{int x,id;
}c[200005];
int n,m,tmp;
bool cmp(node a,node b)
{return a.x+a.id<=b.x+b.id;//跟思路一样排序
}
int main()
{int t;cin>>t;while(t--){memset(c,0,sizeof(c));cin>>n>>m;for(int i=1;i<=n;i++){cin>>tmp;c[i].x=tmp;c[i].id=i;}sort(c+1,c+n+1,cmp);int i=0;while(m>=0&&i<=n){i++;m=m-c[i].x-c[i].id;}cout<<i-1<<endl; }return 0;
}
Teleporters (Hard Version)
思路:这一题就是先前缀和记录一下能用的传送门的价值之和,然后在使用二分答案,但是因为起点是 0 0 0 的缘故,所以还要另外枚举 0 0 0 点。
#include<bits/stdc++.h>
#define maxn 2900001
#define int long long
using namespace std;
int T,n,m,ans,a[maxn],s[maxn];
int check(int c,int x,int id)
{//二分最长的合法前缀区间int l=1,r=n,sum=-1;while(l<=r){int mid=l+r>>1;if(s[mid]-(mid>=id?x:0)<=c)sum=mid+(mid>=id?-1:0),l=mid+1;//特判x的影响else r=mid-1;}return sum==-1?0:sum;//可能无解
}
signed main()
{scanf("%lld",&T);while(T--){ans=0;map<int,int>mp;//记录位置scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++) {scanf("%lld",&a[i]);s[i]=min(a[i]+(n-i+1),a[i]+i);//取最小花费}sort(s+1,s+n+1);for(int i=1;i<=n;i++) mp[s[i]]=i,s[i]+=s[i-1];//前缀和for(int i=1;i<=n;i++){if(m-a[i]-i<0) continue;//可能不合法ans=max(ans,check(m-a[i]-i,min(a[i]+(n-i+1),a[i]+i),mp[min(a[i]+(n-i+1),a[i]+i)])+1);//注意要加上当前点i}printf("%lld\n",ans);}return 0;
}
国王游戏
思路:就是按照 a i b i a_ib_i aibi的大小从小到大排序
证明:我们不妨设两个人分别写了 a 1 , b 1 , a 2 , b 2 a_1,b_1,a_2,b_2 a1,b1,a2,b2 且满足 a 1 b 1 > a 2 b 2 a_1b_1>a_2b_2 a1b1>a2b2 则有 a 2 b 1 = a 1 b 2 \tfrac{a_2}{b_1}=\tfrac{a_1}{b_2} b1a2=b2a1
所以有一下两种情况
- 1在2的前面
- 1在2的后面
设在设在 1 , 2 1,2 1,2 之前所有人左手乘积为 k k k,那么对于第一种情况,我们的答案就是
a n s 1 = max ( k b 1 , k a 1 b 2 )
相关文章:
贪心算法笔记
贪心算法笔记 大概内容 贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种 看时间复杂度,一般的就是 O ( n…...
Formality:两种等价状态consistency和equality
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 背景 逻辑锥的等价性检查时,存在两种验证模式:一致(consistency)和等同(equality),要理解这两点,首先得明白综合工具…...
Java Web开发基础:HTML的深度解析与应用
文章目录 前言🌍一.B/S 软件开发架构简述🌍二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 🌍三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…...
第30章 汇编语言--- 性能优化技巧
汇编语言是用于直接编程计算机硬件的低级语言,它几乎是一对一地映射到机器指令。因为汇编代码与特定处理器架构紧密相关,所以在讨论性能优化技巧时,通常需要考虑具体的CPU架构和指令集。 以下是一些通用的汇编语言性能优化技巧,并…...
HTB:Paper[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 对靶机进行子域…...
数据库中的 DDL、DML 和 DCL
数据库中的 DDL、DML 和 DCL 在数据库的定义与操作中,DDL、DML 和 DCL 是三个核心概念,分别用于不同层面的数据库管理与操作。 1. DDL(Data Definition Language) - 数据定义语言 定义 DDL 用于定义和管理数据库的结构或模式。…...
OKR 极简史及理解
大家读完觉得有帮助记得点赞和关注!!! 目录 MBO SMART 和 KPI OKR 1. 什么是 OKR? 1.1 Objectives(目标) 1.2 Key Results(关键成果) KR 应当是困难的,但并非不可…...
电商项目-基于ElasticSearch实现商品搜索功能(四)
一、 高亮显示 1.1 高亮分析 高亮显示是指根据商品关键字搜索商品的时候,显示的页面对关键字给定了特殊样式,让它显示更加突出,如商品搜索中,关键字变成了红色,其实就是给定了红色样式。 1.2 高亮搜索实现步骤解析 …...
TCP封装数据帧
void *send_data(void *arg) //这是一个发送数据的线程 {int sockfd init_tcp_cli("192.168.0.148",50000) //传ip和port,port 50000是因为大概前五万都被其它服务所占用,50000后是私人ipif(sockfd < 0){return NULL;}unsigned char …...
数据结构与算法之二叉树: LeetCode 515. 在每个树行中找最大值 (Ts版)
在每个树行中找最大值 https://leetcode.cn/problems/find-largest-value-in-each-tree-row/description/ 描述 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值 示例1 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2 输入: root [1,2,3]…...
百度视频搜索架构演进
导读 随着信息技术的迅猛发展,搜索引擎作为人们获取信息的主要途径,其背后的技术架构也在不断演进。本文详细阐述了近年来视频搜索排序框架的重大变革,特别是在大模型技术需求驱动下,如何从传统的多阶段级联框架逐步演变为更加高…...
构造函数的原型原型链
代码示例 // 定义一个构造函数 Test function Test() {this.name 张三 }; //向构造函数的原型添加一个属性 age18 Test.prototype.age 18;//使用构造函数 Test 来实例化一个新对象 const test new Test();//向 Object.prototype 添加了一个名为 sex 的属性,其值…...
nginx反向代理及负载均衡
华子目录 nginx反向代理功能http反向代理反向代理配置参数proxy_pass的注意事项案例:反向代理单台后端服务器案例:反向代理实现动静分离案例:反向代理的缓存功能非缓存场景下测压准备缓存缓存场景下测压验证缓存文件 反向代理负载均衡&#x…...
单片机实物成品-011 火灾监测
火灾监测(20个版本) 版本20: oled显示温湿度烟雾浓度火焰传感器天然气浓度窗户风扇水泵排气系统声光报警语音播报按键WIFI模块 ----------------------------------------------------------------------------- https://www.bilibili.com…...
使用 Docker 在 Alpine Linux 下部署 Caddy 服务器
简介 在现代 web 开发中,选择合适的 web 服务器至关重要。Caddy 是一个功能强大的现代化 HTTP/2 服务器,支持自动 HTTPS,配置简单,适合开发和生产环境。Docker 则为我们提供了一种轻量级的容器化技术,使得应用程序的部…...
每日十题八股-2025年1月12日
1.为什么四次挥手之后要等2MSL? 2.服务端出现大量的timewait有哪些原因? 3.TCP和UDP区别是什么? 4.TCP为什么可靠传输 5.怎么用udp实现http? 6.tcp粘包怎么解决? 7.TCP的拥塞控制介绍一下? 8.描述一下打开百度首页后发生的网络过…...
Python中定位包含特定文本信息的元素
目录 一、为什么需要定位包含文本信息的元素 二、使用Selenium定位包含文本的元素 1. 使用find_element_by_link_text 2. 使用find_element_by_partial_link_text 3. 使用XPath定位包含文本的元素 4. 使用CSS选择器定位包含文本的元素 三、使用BeautifulSoup定位包含文本…...
uniapp实现H5页面内容居中与两边留白,打造类似微信公众号阅读体验
在 UniApp 中,由于需要兼容多端应用,我们通常使用 rpx 作为尺寸单位。然而,在某些情况下,如需要实现内容居中且两边留白时,直接使用 rpx 可能会带来一些限制。这时,我们可以考虑使用 px 或 rem 等单位&…...
极品飞车6里的赛道简介
极品飞车里有很多赛道,赛道分为前向赛道Forward、后向赛道Backward。前向赛道Forward是从A点到B点;后向赛道Backward是前向赛道的逆过程,即从B点到A点。这里介绍极品飞车6的赛道长度、中英文名称翻译、难度等级。 序号赛道英文名赛道中文名总长(km)急弯难度等级1Alpine Trai…...
SAP推出云端ERP解决方案,加速零售行业数字化转型
2025年1月9日,SAP发布了一款专为零售行业设计的云端ERP行业解决方案——S/4HANA Cloud Public Edition,进一步推动企业向云端迁移。这款解决方案旨在集中运营数据,整合财务、采购和商品管理流程,以帮助零售企业优化运营效率。 核…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
