贪心(贪婪)算法

主要思想

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

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

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


适用场景

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,一经查实,立即删除!

相关文章

【回溯】Leetcode 22. 括号生成【中等】

括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 解题思路 1、使用回溯…

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

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

Vue 组件通信的几种方式

vue通信方式简介 在Vue.js中&#xff0c;组件间通信可以通过props、$emit、事件总线、Vuex以及Provide/Inject等方式来实现&#xff0c;总的来说&#xff0c;组件通信是现代前端开发中不可或缺的一部分&#xff0c;它可以帮助开发者构建更加模块化、可维护和可扩展的应用。 Pr…

2024年4月18号技术面试总结

1.什么是微服务雪崩?微服务雪崩的解决方案? 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。服务A依赖于服务B,服务A依赖于服务D。现在假设,服务D出现了故障! 它访问这个服务D就必然要等待服务D的结果,那因为服务D出现了故障,那必然不…

String str=“hello“与String str = new String(“hello“)的区别

常量池&#xff08;constant pool&#xff09;指的是在编译期被确定&#xff0c;并被保存在以编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量&#xff0c;也包括字符串常量。 实际上 String str new String("hellow");创建了两个对象&#xf…

Java语言中字符串处理最常见的操作以及注意事项

0. 前言 由于最近线上连续出现跟字符串处理相关的故障&#xff0c;实属不应该。也从这些故障中看到大家对常见的字符串处理API有一些淡忘&#xff0c;希望通过收集整体并总结常见的处理方法&#xff0c;大家温故而知新。 1. 创建和初始化&#xff1a; a. 使用双引号直接创建…

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

春意盎然的四月&#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.应用超链接

IIL IIH

IIH test_no;DATALOG_MSG;TEST_NO(test_no);RELAY_ON PDCL资源FORCE_V_MLDPS给VCC上电5.5vPIN_MODE位leakage_PINS管脚组接地LEVELS(Vcc5d5_lvl,2mS); PIN_INC(leakage_PINS, LOOP_BY_PIN) { RELAY_OFF PDCL资源 RELAY_ON PPMU资源 FORCE_V_PPMU上电5.5v&#xff0c;电流量…

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;共同…

【软考】敏捷方法

目录 一、概念二、敏捷方法2.1 极限编程(XP)2.2 水晶法(Crystal)2.2.1 说明2.2.1 特征 2.3 并列争球法(Scrum)2.4 自适应软件开发(ASD)2.5 敏捷统一过程(AUP)2.5.1 说明2.5.2 执行的活动 一、概念 1.Agile Development。 2.敏捷开发的总体目标是通过“尽可能早地、持续地对有价…

计算机网络: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网站…

麦克斯韦方程简单理解波粒二象性粒子退相干(Quantum Decoherence):微观的动态,宏观的静态量子

目录 麦克斯韦方程简单理解 波粒二象性 粒子退相干(Quantum Decoherence):微观的动态,宏观的静

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当做源码嵌入使…