【算法小讲堂】#1 贪心算法
引入——关于贪心算法
我们先来做一个小游戏——现在假设自己是一个小偷,桌上有一些物品,包括一台iPhone15、一个充电宝、一个眼罩和一个溜溜梅。此时,你听说警察即将到来,那么你会先带走哪个东西呢?
一般来讲,时间一定的话,我们通常会先拿走桌面上最贵的物品。
“先拿最贵的走”,这种思想就是贪心。
贪心算法解决的问题大致如此——
【从大集合中选出东西】
- 排序
- 按顺序选
如此,收益最大。
可是,为什么每次选“最贵的”,最终收益就是最大的?
这并不明显。
很多时候,贪心算法需要严格方式证明,在不同的情景下。
示例——排队接水问题
n n n个同学排队接水,接水的时间分别是 t 1 t1 t1, t 2 t2 t2, t 3 t3 t3, t 4 t4 t4, t 5 t5 t5,…, t n tn tn。
- 如何安排同学接水的顺序?
- 使得平均接水时间最短。
- 并计算出最短的平均接水时间。
分析——特例假想
假设这 n n n名同学打水的时间普遍较短,除了其中的同学小明,他拿了一个水塘大(夸张)的盆来打水。
此刻,如果让他站在队伍的最前面,其他同学等待时间是不是就非常非常久了,我们的平均等待时间想必就非常大了。
因此,合理的安排是——
让打水快的同学尽可能站在队伍前面。
模型——解决问题的一般方法
我们需要按一定的步骤解决此类问题,一般来讲,第一步是排序,明白什么样的同学应该排在前面;第二步是选择,模拟此过程计算出平均接水时间。
A 排序
找到符合贪心思想的排序方案——打水快的排前面。
B 选择
依次序进行选择,模拟目标过程计算所需答案。
补充 数学证明
这种符合直觉的贪心方法未必能够经得起数学的推敲。为了保证做法的正确,我们通常还要建立数学模型,利用数学手段证明这一解决问题的方法是行之有效的。
在贪心算法的问题中,常见地需要使用到诸如排序不等式的数学公式。
一些尝试——加上一些限制条件
在一开始,我们假设了一个情境。
此时我们希望加入再一些限制条件,使得其更符合现实生活——
- 背包的容量是有限的
- 每一样物品是既有重量又有价值的
倘若这样,那么我们就不仅仅需要考虑物品的价值。
因为向背包装入最贵的东西后,可能再也没用地方装下其余同样有很高价值但重量小的物品了。

此类问题成为了相对复杂一些的01背包问题。
现实生活中,还可能有以下情形——
由于警察并不一定往往在最后赶到,实际应该是在不同时刻赶到的概率是不相同的。
此时,我们需要利用动态规划解决,以求得最大的数学期望。
再看冒泡排序——排序的贪心本质

先假定一个情形——你拿到一堆标着数字的卡片(可能有100张),你需要做的是给卡片按数字从小到大的顺序进行排序。
你本能会做的是先铺开这些卡片,整体上看看这些数字大小。
当你的眼睛落在任意两张不同数字的卡片上,会有这样的情况——
(左边的卡片是 N 1 N1 N1,右边的卡片是 N 2 N2 N2)
目标的情形是 N 1 < N 2 N1<N2 N1<N2,所以如果左边的数字大于右边的数字,我们尝试交换。
显然,这种做法没有什么条理。但是可以确信的是——
在每一次操作后,我们都更加接近那个正确的答案。
而经过有限次操作后,就一定能够得到最优解,即正确的排序。
而冒泡排序,其实就是按照一定的规律执行判断-交换的步骤。
思想的本质依旧是贪心。
贪心的局部探索——动态规划

一个思考问题:给出一个山的三维模型(图片见上),目标求得此山中的最低点。
假设你是一位在这个山中迷路的攀登者,而山里起了大雾,你需要尽快到山的低洼处修整。你只能知道你所站的地方的坡度,没有其余办法找到那个低洼处。
此时,为找到低洼处,我们会做的一定是一直向**“下”走,即一直下坡,直到不能再下坡**。
最终找到的未必是最低点,寻找的过程中很有可能一步就走到了再也回不去的道路(指远离最优解),但是我们知道,至少这样,让我们错误的概率更小一些。因为哪怕这个点不是全局中的最优解,它也会是我在这个区域能够找到的最好的解。
这个试探的过程,我们称之为局部搜索。
贪心算法的问题实例
🟢 [NOIP1998 提高组] 拼数
比较传统的贪心问题,解决问题的关键在于比较和交换相邻的数字串,一步步逼近最佳的答案。
题目描述
设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n n n。
第二行有 n n n 个整数,表示给出的 n n n 个整数 a i a_i ai。
输出格式
一个正整数,表示最大的整数
样例 #1
样例输入 #1
3
13 312 343
样例输出 #1
34331213
样例 #2
样例输入 #2
4
7 13 4 246
样例输出 #2
7424613
提示
对于全部的测试点,保证 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20, 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109。
NOIP1998 提高组 第二题
🟢 [NOIP2012 提高组] 国王游戏
此题级别为
普及+/提高。与前面一题不同的是,这里增加了变量,考虑时不妨先手动从简单的情形起开始模拟。
题目描述
恰逢 H 国国庆,国王邀请 n n n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n n n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
输入格式
第一行包含一个整数 n n n,表示大臣的人数。
第二行包含两个整数 a a a 和 b b b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n n n 行,每行包含两个整数 a a a 和 b b b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
样例 #1
样例输入 #1
3
1 1
2 3
7 4
4 6
样例输出 #1
2
提示
【输入输出样例说明】
按 1 1 1、 2 2 2、 3 3 3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2 2 2;
按 1 1 1、 3 3 3、 2 2 2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2 2 2;
按 2 2 2、 1 1 1、 3 3 3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2 2 2;
按$ 2$、 3 3 3、$1 $这样排列队伍,获得奖赏最多的大臣所获得金币数为 9 9 9;
按 3 3 3、 1 1 1、$2 $这样排列队伍,获得奖赏最多的大臣所获得金币数为 2 2 2;
按$ 3$、 2 2 2、 1 1 1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9 9 9。
因此,奖赏最多的大臣最少获得 2 2 2 个金币,答案输出 2 2 2。
【数据范围】
对于 20 % 20\% 20% 的数据,有 1 ≤ n ≤ 10 , 0 < a , b < 8 1≤ n≤ 10,0 < a,b < 8 1≤n≤10,0<a,b<8;
对于 40 % 40\% 40% 的数据,有$ 1≤ n≤20,0 < a,b < 8$;
对于 60 % 60\% 60% 的数据,有 1 ≤ n ≤ 100 1≤ n≤100 1≤n≤100;
对于 60 % 60\% 60% 的数据,保证答案不超过 1 0 9 10^9 109;
对于 100 % 100\% 100% 的数据,有 1 ≤ n ≤ 1 , 000 , 0 < a , b < 10000 1 ≤ n ≤1,000,0 < a,b < 10000 1≤n≤1,000,0<a,b<10000。
NOIP 2012 提高组 第一天 第二题
🟨参考与引用
洛谷
贪心算法基础 (JSOI24 冬令营) 南京大学-蒋炎岩
相关文章:
【算法小讲堂】#1 贪心算法
引入——关于贪心算法 我们先来做一个小游戏——现在假设自己是一个小偷,桌上有一些物品,包括一台iPhone15、一个充电宝、一个眼罩和一个溜溜梅。此时,你听说警察即将到来,那么你会先带走哪个东西呢? 一般来讲…...
判断当前shell版本
查看$SHELL环境变量: echo $SHELL输出的结果将是当前使用的shell的路径。例如,如果输出为 /bin/bash,则表示当前使用的是Bash shell。 查看ps命令输出: ps -p $$上述命令将显示当前终端进程的信息,其中 $$ 代表当前进…...
如何实现两个电脑之间通过以太网(网线)实现文件互传
如何实现两个电脑之间通过以太网(网线)实现文件互传 本帖目的:介绍如何通过以太网(网线)连接两台电脑,通过文件夹共享的方式,实现两台电脑之间的文件互传。 本帖以笔者实际工作上遇到的场景为例…...
Jenkins 中部署Nodejs插件并使用,并构建前端项目(3)
遇到多个版本nodeJS需要构建的时候 1、第一种就是一个配置安装,然后进行选中配置 2、第二种就是插件:nvm-wrapper,我们还是选用NodeJS插件: (1)可以加载任意npmrc文件; (2&#x…...
VUE为什么有的属性要加冒号
<el-menu-item :index "/item.menuClick" v-for"(item,i) in menu"><i class"item.menuIcon" ></i><span slot"title">{{item.menuName}}</span></el-menu-item>不加不行 加了好像是吧整体作为…...
微信小程序 --- wx.request网络请求封装
网络请求封装 网络请求模块难度较大,如果学习起来感觉吃力,可以直接学习 [请求封装-使用 npm 包发送请求] 以后的模块 01. 为什么要封装 wx.request 小程序大多数 API 都是异步 API,如 wx.request(),wx.login() 等。这类 API 接口…...
通义千问Qwen-7B-Chat Windows本地部署教程-详细认真版
通义千问本地部署教程🚀 本专栏的第四弹,在实现了联网调用通义千问模型进行多轮对话,流式输出,以及结合LangChain实现自建知识库之后,开始准备考虑实现对大模型进行本地部署,网上找不到看着比较舒服的教程&…...
探索C语言位段的秘密
位段 1. 什么是位段2. 位段的内存分配3. 位段的跨平台问题4. 位段的应用4. 使用位段的注意事项 1. 什么是位段 我们使用结构体实现位段,位段的声明和结构体是类似的,有两个不同: 位段的成员必须是int,unsigned int,或…...
数据库-数据库设计-社交关系
佛 每有一个新方案,就要考虑有什么影响增删改查可扩展性 MySQL 根据ER图设计表 create table follow(id bigint unsigned not null auto_increment comment 主键,gmt_create datetime null default current_timestamp,gmt_modified null default current_timest…...
YOLO算法改进Backbone系列之:EfficientViT
EfficientViT: Memory Effificient Vision Transformer with Cascaded Group Attention 摘要:视觉transformer由于其高模型能力而取得了巨大的成功。然而,它们卓越的性能伴随着沉重的计算成本,这使得它们不适合实时应用。在这篇论文中&#x…...
JANGOW: 1.0.1
kali:192.168.223.128 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -p- 192.168.223.154 开启了21 80端口 web看一下,有个busque.php参数是buscar,但是不知道输入什么,尝试文件包含失败 扫描目录 dirsearch -u http://192.168.223.154 dirse…...
Elasticsearch 创建index库 timeout
问题概述 使用 python 客户端 代码进行创建,【之前成功创建,但是现在出现报错,报错代码es_connection.client.indices.create】def create_vector_index(dataset_index_name,vector_query_field,query_field):es_connection = get_collention(dataset_index_name,vector_que…...
2024最新可用免费天气预报API接口
天气API接口数据, 数据字段最全,免费,稳定的实况天气预报接口 5分钟左右更新一次,支持全国3000多个市区县, 包含基本天气信息、24小时逐小时天气、气象预警列表、湿度、能见度、气压、降雨量、紫外线、风力风向风速、日出日落、空气质量、pm2…...
【AIGC】开源声音克隆GPT-SoVITS
GPT-SoVITS 是由 RVC 创始人 RVC-Boss 与 AI 声音转换技术专家 Rcell 共同开发的一款跨语言 TTS 克隆项目,被誉为“最强大中文声音克隆项目” 相比以往的声音克隆项目,GPT-SoVITS 对硬件配置的要求相对较低,一般只需 6GB 显存以上的 GPU 即可…...
YOLOv9图像标注和格式转换
一、软件安装 labelimg安装(anaconda) 方法一、 pip install labelImg 方法二、 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i ht…...
车载系统相关
车载SBL和EC系统介绍 一、概述 车载SBL(Signal Broadcasting Layer)和EC(Electronic Control)系统是现代汽车中不可或缺的组成部分。它们共同协作,确保车辆的稳定、安全和高效运行 二、SBL系统介绍 SBL系统&#x…...
AWS对文本进行语言识别
AWS提供了名为Amazon Comprehend 的服务,它支持对文本进行语言识别。Amazon Comprehend 是一项自然语言处理(NLP)服务,它可以用于分析文本并提取有关文本内容的信息。 我们可以通过使用 Amazon Comprehend API 轻松地集成这些功能…...
HTTP 与HTTPS笔记
HTTP 80 HTTP是一个在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的约定和规范。 HTTP状态码 1xx 提示信息,表示目前是协议处理的中间状态,还需要后续的操作;2xx 200 204 026 成功3xx 重定向ÿ…...
【k8s配置与存储--配置管理】
1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦,便于应用配…...
如何在C++中嵌入SQL语句?解释一下什么是ODBC、JDBC以及它们在C++数据库编程中的作用。
如何在C中嵌入SQL语句? 在C中嵌入SQL语句通常涉及使用数据库连接库或ORM(对象关系映射)框架,这些工具提供了与特定数据库管理系统(DBMS)交互的接口。以下是几种在C中嵌入SQL语句的常见方法: 使…...
seo关键词挖掘工具哪个好_seo数据分析工具哪个最强
选择最佳SEO关键词挖掘工具和SEO数据分析工具指南 SEO关键词挖掘工具哪个好 在当今数字营销的竞争激烈环境中,选择合适的SEO关键词挖掘工具至关重要。这不仅能帮助你找到最相关、最受欢迎的关键词,还能显著提升你的网站流量和搜索引擎排名。市面上哪些…...
从特征多项式到行列式:揭秘矩阵特征值之积的几何意义
1. 特征多项式:打开矩阵奥秘的钥匙 我第一次接触特征多项式时,完全被这个抽象的概念搞晕了。直到有一天,我的导师用了一个简单的比喻:"特征多项式就像是矩阵的DNA检测报告,它能告诉我们这个矩阵最本质的特性。&qu…...
Vue大屏自适应实战指南:v-scale-screen深度解析与完整方案
Vue大屏自适应实战指南:v-scale-screen深度解析与完整方案 【免费下载链接】v-scale-screen Vue large screen adaptive component vue大屏自适应组件 项目地址: https://gitcode.com/gh_mirrors/vs/v-scale-screen 在当今数据驱动的时代,大屏数据…...
YimMenu安全指南与效率提升:GTA5辅助工具全面应用手册
YimMenu安全指南与效率提升:GTA5辅助工具全面应用手册 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimM…...
终极抖音无水印下载指南:如何快速批量获取高质量视频素材
终极抖音无水印下载指南:如何快速批量获取高质量视频素材 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...
SO(3) (本质理解)
一、SO(3) 是什么 SO(3)(Special Orthogonal Group): 几何理解(非常重要) SO(3) 表示: “刚体绕某个轴旋转一个角度” 任何旋转都可以表示为: 一个单位轴 一个角度 这就是: 轴…...
【Scratch×AI 系列 05】工程化实战:先统一目录(init),再拆分流水线(plan / exec-plan / build)
摘要 Scratch 项目最容易“做着做着就乱”:素材散落、版本混杂、产物找不到,AI 更是无从下手xw-scratch-init 不是“创建文件夹”,而是把协作与自动化的前提一次性铺好把流程拆成 plan → exec-plan → build,是为了把 AI 从“胡写…...
Graphormer在纳米材料设计中的应用:碳纳米管手性与导电性关联预测
Graphormer在纳米材料设计中的应用:碳纳米管手性与导电性关联预测 1. 项目概述 Graphormer是一种基于纯Transformer架构的图神经网络,专门为分子图(原子-键结构)的全局结构建模与属性预测而设计。该模型在OGB、PCQM4M等分子基准…...
如何用3步永久保存QQ空间回忆?GetQzonehistory全攻略
如何用3步永久保存QQ空间回忆?GetQzonehistory全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心过QQ空间里那些承载青春记忆的说说会突然消失?Ge…...
子代理拆分任务:为什么要用上下文隔离保护 Agent 的思路清晰
子代理拆分任务:为什么要用上下文隔离保护 Agent 的思路清晰 很多人第一次看到子代理,注意力会先落在“一个 Agent 还能再叫出另一个 Agent”这件事上。这个现象当然有意思,但如果只停在这里,很容易错过 s04 真正想解决的问题。 …...

