贪心(贪婪)算法

主要思想

贪心算法的思想主要可以概括为“总是做出当前看起来最优的选择”,也就是不从整体上进行考虑,所得到的答案是某种意义上的局部最优解,不一定是整体最优解。

贪心算法没有固定算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

贪心算法一般用于得到某些问题的“最优解”,一般来说具体表现为,求解某种最大值或者最小值(因为贪心一定是以某种策略选择局部最优,所以不会得到所有解的情况)


适用场景

1. 贪心选择性质

一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

2. 最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。

基本解题思路

  1. 把求解的问题分成若干个子问题。
  2. 对每一子问题求解,得到子问题的局部最优解。
  3. 把子问题的解局部最优解合成原来解问题的一个解。

tips.在贪心算法中,很多时候需要数据具有有序性(因为这样你才能按照顺序去考虑所谓的"最优")

例题

1.排队打水

AcWing 913. 排队打水 - AcWing

 这个题可以类比为现实生活中,在超市购物时,在你前方排队的人拿着一车的商品,而你只想买一瓶可乐,那么如果你先结账,他只需等待几秒,如果他先结账,那么你将会等待几分钟那么我们可以得知,对于局部而言,有 “结账时间短的优先结账可以节约时间” 的初步结论,并且显而易见,商品越少的人越早结账,就会越节约所有人的整体时间,可以由此推出整体结论。

那么代码逻辑就很清晰了,如果打水时间短的需要在前面,我们就需要对他们进行排序

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;const int N = 1e5 + 10;int n;
LL ans;
int a[N];int main()
{cin >> n;for(int i=0;i<n;i++) cin >> a[i];sort(a,a+n);for(int i=0;i<n;i++){ans += a[i] * (n-i-1);}cout << ans;return 0;
}

2.货仓选址

104. 货仓选址 - AcWing题库

看到这个题目,思考一下在初中时是不是有这样一种几何题:

当一个点在何处时, 使得他与另外两个点 a,b 的距离之和最小

答案: 在a,b两点连成的线段上

那么本题已经保证了都在同一条数轴上,但是点由a,b两个变成了更多,那么我们将这个问题转化成一个几何问题的模型:当一个点在何处时, 使得他与另外n个点的距离之和最小

答案不难思考便可得出,在中间点上(n为奇数)或中间两点的线段上(n为偶数),据此我们可以写出完整代码,如下。

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;const int N=1e5+10;
int a[N];
int n,ans;int main()
{cin >> n;for(int i=0;i<n;i++) cin >> a[i];sort(a,a+n);for(int i=0;i<n;i++) ans += abs(a[n>>1] - a[i]);cout << ans;return 0;
}

 3.huffman

AcWing 148. 合并果子 - AcWing

        哈夫曼树其实也是基于贪心来构建的一种特殊二叉树,其主要构建方法就是每次将序列中最小的两个结点合并,得到新的父节点并加入回序列,直到序列完全变成一个二叉树结构

分析题意可以得知我们需要不断合并两堆果子,并且每次合并的消耗是两堆果子的数量,那么如果消耗要尽量小,我们需要尽量避免大堆的果子的合并,这跟哈夫曼树的构建过程不约而同,在本题中,我们不需要用到哈夫曼编码,所以我们可以借用小根堆来模拟哈夫曼树的构建过程,代码表示如下:

#include<iostream>
#include<queue>
#include<vector>
using namespace std;priority_queue<int,vector<int>,greater<int>> a;
int n;
long long ans;int main()
{cin >> n;for(int i = 0;i<n;i++){int x;cin >> x;a.push(x);}while(a.size() > 1){int x = a.top();a.pop();int y = a.top();a.pop();a.push(x+y);ans += (x+y);}cout << ans;return 0;
}

练习题

光靠以上几个题目对贪心只是做一个入门了解,多刷题才能更深入透彻的理解贪心算法,以下是几个练习题目,可以闲时做着玩玩。

  • P2240 部分背包问题
  • P8637 [蓝桥杯 2016 省 B] 交换瓶子
  • P8669 [蓝桥杯 2018 省 B] 乘积最大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI原生时代,操作系统为何是创新之源?

一直以来&#xff0c;操作系统都是软件行业皇冠上的明珠。 从上世纪40、50年代&#xff0c;汇编语言和汇编器实现软件管理硬件&#xff0c;操作系统的雏形出现&#xff1b;到60年代&#xff0c;高级编程语言和编译器诞生&#xff0c;开发者通过操作系统用更接近人的表达方式去…

方程豹春季品牌发布会:全家族矩阵献礼比亚迪

春意盎然的四月&#xff0c;深圳也迎来了中国新能源汽车领域的一场盛事。 4月16日&#xff0c;作为比亚迪旗下全球首个专业个性化汽车品牌&#xff0c;方程豹在深圳隆重举办春季发布会。 在这场以“方华”为主题的发布会上&#xff0c;方程豹汽车全家族矩阵首次集体亮相&#x…

【数据结构】单链表经典算法题的巧妙解题思路

目录 题目 1.移除链表元素 2.反转链表 3.链表的中间节点 4.合并两个有序链表 5.环形链表的约瑟夫问题 解析 题目1&#xff1a;创建新链表 题目2&#xff1a;巧用三个指针 题目3&#xff1a;快慢指针 题目4&#xff1a;哨兵位节点 题目5&#xff1a;环形链表 介绍完了…

美化博客文章(持续更新)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;游戏实现&#xff1a;贪吃蛇​​​​​​ &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 该文提供我的一些文章设计的一些方法 目录 1.应用超链接 1.应用超链接

mysql in查询优化

都说in查询比较慢&#xff0c;要改成子查询模式&#xff0c;ChatGPT大模型告诉了我&#xff0c;SQL中替换In查询的10种方法&#xff0c;太赞了&#xff0c;按照这个说的集中方法&#xff0c;验证一下。因为实际项目中确实存在in很多的情况。 查询执行的先后顺序对优化有必要&am…

【EI会议征稿】2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)

2024 International Conference on Advanced Mechatronic, Electrical Engineering and Automation ●会议简介 2024年先进机械电子、电气工程与自动化国际学术会议&#xff08;ICAMEEA 2024&#xff09;将汇聚全球机械电子、电气工程与自动化领域的专家学者&#xff0c;共同…

计算机网络:CSMA/CA协议

计算机网络&#xff1a;CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前&#xff0c;我们回顾一下CSMA/CD的三个特性&#xff1a; 多址接入MA&#xff1a;多个主机连接在一条总线上&#xff0c;竞争使用总线 载波监听CS&#xff1a…

web网站搭建实验

综合练习&#xff1a;请给openlab搭建web网站 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料 和缴费网站&#xff0c;基于&#xff0c;www.openlab.com/data网站…

X-314智能合约:金融创新的强大引擎

&#x1f4a5;火爆到烫手的X-314智能合约&#x1f525; X-314智能合约是基于以太坊区块链开发的&#xff0c;具有高度可定制性和灵活性。 ave开单独板块&#xff1b;详细资料已经准备好&#xff1b;对web3感兴趣的大佬货&#xff1b;多交流多指导&#x1f91d; ​X-314智能合…

JUC(java.util.concurrent) 的常见类

Callable 接口 Callable 的用法 Callable 是一个 interface&#xff08;类似之前的 Runnable&#xff0c;用来描述一个任务&#xff0c;但是没有返回值&#xff09;也是描述一个任务的&#xff0c;有返回值。方便程序猿借助多线程的方式计算结果. 例如&#xff1a;创建线程…

Zynq7000系列中PL时钟使用

可编程逻辑&#xff08;PL&#xff09;具有自己的时钟管理生成和分配功能&#xff0c;并从处理器系统&#xff08;PS&#xff09;中的时钟发生器接收四个时钟信号&#xff08;如图25-10所示&#xff09;。 在嵌入式系统中&#xff0c;PL时钟的管理和分配对于确保逻辑电路的正确…

QT跨平台读写Excel

QT跨平台读写Excel 背景Excel工具CMakeLists.txt工程目录 背景 开发框架QT&#xff0c;makefile构建工具CMake&#xff0c;编译器MinGW Excel工具 考虑跨平台则不能使用针对微软COM组件的QAxObject来读写Excel&#xff0c;因此使用开源QtXlsx。 这里是将QXlsx当做源码嵌入使…

使用FastDDS编译IDL文件

1.安装FastDDS环境 Ubuntu22.04 1.1安装依赖的软件 sudo apt-get update //基础工具安装 sudo apt install cmake g python3-pip wget git //Asio 是一个用于网络和低级 I/O 编程的跨平台C库&#xff0c;它提供了一致的 异步模型。 TinyXML2是一个简单&#xff0c;小巧&…

Redis进阶——GEO地理坐标附近商户案例

目录 GEO数据结构的基本用法GEO概述GEO命令的使用GEO数据结构练习 导入店铺数据到GEO业务场景实现代码如下 实现附近商户功能 GEO数据结构的基本用法 GEO概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储…

过氧化氢滴定方法可用的PFA器皿有哪些?

滴定液:KMnO4标准溶液 试液:H2O2商品液(3%)&#xff0c;H2SO4 (3.0mol/L ) 指示剂:酚酞指示剂 仪器:分析天平&#xff0c;PFA酸式滴定管50mL&#xff0c;PFA 移液管10mL/25mL、PFA 容量瓶250mL、PFA锥形瓶250mL 1、KMnO4标准溶液浓度的标定(见实验:高锰酸钾标准溶液的配制与…

nodejs工具脚本json转excel

json转excel 主要使用 sheetjs 库 vim convertJsonToExcel.js 封装转换方法 import fs from fs; import XLSX from xlsx;/*** 扁平化嵌套json对象* param {Object} jsonObj* param {String} prefix* returns*/ export function flattenKeys(jsonObj, prefix ) {const resul…

java-springmvc 01

MVC就是和Tomcat有关。 01.MVC启动的第一步&#xff0c;启动Tomcat 02.Tomcat会解析web-inf的web.xml文件

战姬物语部署

一.准备环境 #关闭seliunx和防火墙 setenforce 0 systemctl stop firewalld systemctl disable firewalld #配置源&#xff0c;并安装常用工 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo …

Spring Task 定时任务(含结合cron 表达式)

目录 一、Spring Task的介绍 二、使用方法 2.1 配置类启用定时任务支持&#xff1a; 2.2 同步定时任务 ​编辑2.3 fixedRate 可以看出不能满足我们的日常需求 那如何让其开启异步呢&#xff08;开启多个线程工作&#xff09; 三、Spring Task 结合cron表达式 3.1 corn 表…

【动态规划】dp 路径问题(不同路径、路径最小和、地下城游戏...)

文章目录 1. 前言 - 理解动态规划算法1.5 关于dp路径问题2. 例题2.1_不同路径Warning. 关于状态表示 3. 算法题3.1_不同路径II3.2_珠宝的最高价值3.3_下降路径最小和3.4_最小路径和3.5_地下城游戏关于状态表示的两种选法&#xff1a; 1. 前言 - 理解动态规划算法 关于 动态规划…