Acwing 贪心算法遗留

news2024/10/10 13:28:29

1.Huffman树

Acwing 148.合并果子
在这里插入图片描述
实现思路:构建一颗哈夫曼树,求最短带权路径长度(树中所有的叶结点的权值乘上其到根结点的路径长度)

  • 每次选择重量最小的两堆进行合并
  • 使用小根堆存储每一堆果子,每次两次弹出堆顶元素,合并后就放入小根堆中

具体实现代码(详解版):

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;  // 输入元素数量
    
    // 使用最小堆来保存元素
    priority_queue<int, vector<int>, greater<int>> heap;
    
    // 读取 n 个整数并将其压入最小堆
    for (int i = 0; i < n; ++i) {
        int x;
        cin >> x;
        heap.push(x);
    }
    
    int res = 0;  // 保存合并的总代价
    
    // 每次取出两个最小的元素,直到堆中只剩下一个元素
    while (heap.size() > 1) {
        int a = heap.top(); heap.pop();  // 取出堆中最小的元素
        int b = heap.top(); heap.pop();  // 取出堆中第二小的元素
        
        res += a + b;  // 计算这次合并的代价,并累加到总代价
        heap.push(a + b);  // 将合并后的元素重新压入堆中
    }
    
    cout << res << endl;  // 输出最终的总代价
    
    return 0;
}

2. 排序不等式

Acwing 913.排队打水
在这里插入图片描述
实现思路:
假设各个同学的打水时间为:3 6 1 4 2 5 7 并且就按照这个顺序来打水。 当第一个同学打的时候,后面所有同学都要等他,所以等待的总时长要加上一个3 * 6,第二个同学打的时候,后面所有同学也都要等他,所以要加上个6 * 5,以此类推,所有同学等待的总时长为3 * 6 + 6 * 5 + 1 * 4 + 4 * 3 + 2 * 2 + 5 * 1

假设各个同学打水花费的时长为 t1,t2,t3,…,tn,则按照次序打水,总的等待时长为:t1 * (n-1) + t2 * (n-2) + ... + tn * 1

可以看出,当打水顺序按照花费时间从小到大排序时,所得的等待时间最小

采用反证法(调整法),假设最优解不是按照从小到大的顺序,则必然存在2个相邻的人,前一个人打水时长比后一个大,即必然存在一个位置i,满足t_i > t_i+1,那我们尝试把这两个同学的位置交换,看看对总的等待时长有什么影响,这两个同学的交换,只会影响他们两的等待时长,不会影响其他同学的等待时长。 交换前,这部分等待时长为t_i * (n-i) + t_i+1 * (n-i-1),交换后,这部分等待时长为t_i+1 * (n-i) + t_i * (n-i-1),容易算得,交换后的等待时长变小了,则该方案不是最优解,矛盾了。则最优解就是按照从小到大的顺序依次打水。

具体实现代码:

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;
typedef long long LL;
int n,t[N];

int main(){
    cin >> n;
    for(int i = 0 ; i < n ; i ++) cin >> t[i];
    sort(t,t + n);
    
    LL res = 0;
    for(int i = 0 ; i < n ; i ++) res += t[i] * (n - i - 1);
    
    cout << res << endl;
    
    return 0;
}

3.绝对值不等式

Acwing 104.货舱选址
在这里插入图片描述
思路分析:
假设n个商店在数轴上的坐标依次为:x1x2x3,…,xn

设仓库的位置为x,则总的距离为

f(x) = |x1 - x| + |x2 - x| + ... + |xn - x|

我们要求解的就是f(x)的最小值。

我们可以先进行一下分组,1n为一组,2n-1为一组…

f(x) = (|x1 - x| + |xn - x|) + (|x2 - x| + |x_n-1 - x|) + ....

单独看一组,任意一组都可以写成形如|a - x| + |b - x|的形式,ab是已知的常数,x是未知数。假设a < b,则容易知道,当x取值在[a,b]这个区间内时,上面的表达式取得最小值b - a,而x取值只要落在[a,b]区间外,则上面的表达式的值一定是大于b - a的。

由此可知,对于分组1n,只要x取值在[x1,xn]这个区间内,就能使|x1 - x| + |xn - x|取得最小值xn - x1。同理,对于|x2 - x| + |x_n-1 - x|,只要x取值在[x2,x_n-1]区间内,就能使这个部分取得最小值x_n-1 - x2…容易得出,只要取所有分组的区间的交集即整个区间的中间点,能使总的f(x)最小。即,当n为偶数时,x只要落在最中间2个点之间即可;当n为奇数时,x只需要落在最中间的那个点上即可。

具体实现代码:

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1000010;

int p[N];
int n;

int main(){
    int n;
    cin >> n;
    for(int i = 0 ; i < n ; i ++) cin >> p[i];
    sort(p,p + n);
    
    int res = 0;
    for(int i = 0 ; i < n ; i ++) res += abs(p[i] - p[n / 2]);
    
    
    cout << res << endl;
    return 0;
}

4.推公式

Acwing 125.耍杂技的牛
在这里插入图片描述
实现思路:wi表示牛的体重,si表示牛的强壮度
先给结论:按照w + s从小到大的顺序,从上往下排,最大的危险系数一定是最小的。

简单理解:把重量轻的牛放下面是很亏的,同样把不强壮的牛放下面也是亏的,所以就尽可能把又重又强壮的牛放下面

就不证明了。

#include <iostream>
#include <algorithm>

using namespace std;

typedef pair<int,int> PII;//存储牛的体重+强健度,体重
const int N = 50010;

PII cow[N];
int n;

int main(){
    cin >> n;
    for(int i = 0 ; i < n ; i ++){
        int w,s;
        cin >> w >> s;
        cow[i] = {w + s,w};
    }
    sort(cow ,cow + n);//自动先按体重+强健度排序
    int sum = 0,res = -2e9;
    
    for(int i = 0 ; i < n ; i ++){
        int w = cow[i].second,s = cow[i].first - w;//s为强健度
        res = max(res,sum - s);
        sum += w;
    }
    
    cout << res << endl;
}

总结:贪心算法(Greedy Algorithm)是一类在每一步选择中都采取当前最优策略,以期最终获得全局最优解的算法。贪心算法非常适用于解决局部最优能够导出全局最优的场景。在实际应用中,贪心算法通常比动态规划和回溯算法更为简单高效,但它并不总是能保证找到最优解。因此,贪心算法的应用需要证明其贪心策略是正确的,确保每一步的局部最优解能够累积成为全局最优解。

完结撒花~多复习

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

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

相关文章

ML 系列:机器学习和深度学习的深层次总结( 15) — KNN — 第 1 部分

一、说明 K-最近邻 (KNN) 算法是一种流行的监督机器学习算法&#xff0c;用于分类和回归任务。它是非参数惰性学习算法的一个典型例子。KNN 被认为是一种惰性学习算法&#xff0c;因为它在训练阶段不对底层数据分布做出任何假设&#xff0c;也不从训练数据中学习特定模型。相反…

uniapp开发 使用vscode代替hbuilderx开发工具

前言&#xff1a;最近接手了一个uniapp项目&#xff0c;很久没有使用hbuilderx了&#xff0c;用着实在难受&#xff0c;并且还总报奇奇怪怪的错误&#xff0c;首次运行要下载很多插件&#xff0c;搜索文件也用不习惯&#xff0c;加上很多鼠标操作&#xff0c;实在是太影响开发效…

【MATLAB源码-第241期】基于simulink的异步buck降压电路仿真,输出UL IL UR以及PWM波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Buck变换器是一种直流降压转换器&#xff0c;旨在将较高的输入电压转换为较低的输出电压&#xff0c;并广泛应用于各种电源管理系统中。图中的Buck变换器模型通过一系列的电力电子元件和控制信号实现降压功能。 首先&#xf…

QT:“提升为“使用(自定义控件)

目录 一.步骤与作用 1.步骤 2.作用 二.使用 1.mainwindow.ui ->拖一个 Push Button 控件到画布->右击Push Button弹出对话框->单击"提升为" 2.输入提升类名称MyButton->点击添加 3.选择基类名称为QPushButton,点击提升 4.新建MyButton文件 5.在…

《Java基础》变量和数据类型

综述 在开始学习变量之前&#xff0c;我们思考一下为什么需要使用变量。 首先我们从小开始学习加法减法的时候&#xff0c;后来我们再学更难的东西就是代数&#xff0c;其中的x和y是我们要求解的内容&#xff0c;这些内容就是变量。 变量是人的思维的提升&#xff0c;没有变量…

无人机侦测:手提式无线电侦测设备技术详解

手提式无线电侦测设备在无人机侦测中扮演着重要角色&#xff0c;它主要通过侦测无人机与遥控器或地面站之间的无线电信号来实现对无人机的监测和定位。以下是对手提式无线电侦测设备技术的详细解析&#xff1a; 一、技术原理 手提式无线电侦测设备通过无线电侦测技术&#xf…

vue基础(总结很详细)

vue 基础 1. vue 是什么&#xff1f; Vue.js &#xff08;读音 /vju ː /, 类似于 view &#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图…

Day2 IDEA

使用IDEA开发第一个程序 代码结构&#xff1a;Project - Module - Package - Class 作用&#xff1a;便于管理代码 例如&#xff1a; 创建一个空工程 创建module模块 创建package&#xff0c;一般以公司域名倒写技术名称 例如&#xff1a;com.test.hello 创建类 class He…

使用QFileInfo类判断同名文件存在

问题描述:使用QT保存文件时&#xff0c;如果文件名相同&#xff0c;保存后原来的文件会被覆盖引用博客 首先在QT项目中新建一个按钮 再右击选择转到槽&#xff0c;这时候就会跳转到刚刚生成的槽函数 代码 void MainWindow::on_pushButton_5_clicked() {QString fileName QF…

nginx 资料整理(一)

nginx 1. 简介2. web服务器2.1 相关文件2.2 主配置文件1. 全局块&#xff08;events之前的部分&#xff09;2. events块&#xff08;events{...}&#xff09;3. http块&#xff08;http{...}&#xff09; 2.3 子配置文件 官网 https://nginx.org/ 1. 简介 nginx (engine x) 是…

DeerPlus 2.85| 外语学习利器,趣味闯关学习外语

DeerPlus 是一款非常专业的外语学习应用&#xff0c;支持多种语言的学习&#xff0c;如汉语、英语、日语、韩语、法语、西班牙语、德语等&#xff0c;从单词、发音、语法等各个方面全面系统地教你学习&#xff0c;让你快速掌握多种语言。特点&#xff1a;- 10多种游戏模式- 100…

计算机毕业设计 基于Python音乐平台的设计与实现 Python毕业设计 Python毕业设计选题 Vue 前后端分离【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

C++核心编程和桌面应用开发 第九天(静态多态 动态多态 纯虚函数 抽象类 虚析构 纯虚析构 向上向下类型转换 重载重写重定义)

目录 1.1静态多态 1.2动态多态 1.2.1满足条件 1.2.2动态多态的使用条件 1.3纯虚函数和抽象类 1.3.1纯虚函数 1.3.2抽象类 1.4虚析构/纯虚析构 1.5向上向下类型转换 1.5.1向下类型转换 1.5.2向上类型转换 1.5.3多态中的类型转换 1.6重载重写重定义 1.6.1重载 1.6…

中国工业大模型行业发展研究报告

**工业大模型伴随着大模型技术的发展&#xff0c;逐渐渗透至工业&#xff0c;处于萌芽阶段。**就大模型的本质而言&#xff0c;是由一系列参数化的数学函数组成的计算系统&#xff0c;且是一个概率模型&#xff0c;其工作机制是基于概率和统计推动进行的&#xff0c;而非真正的…

leetcode 93.复原ip地址

1.题目要求&#xff1a; 2.题目代码: class Solution { public:vector<string> result;// 记录结果// startIndex: 搜索的起始位置&#xff0c;pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum 3) { // 逗点数…

线性回归逻辑回归-笔记

一、线性回归&#xff08;Linear Regression&#xff09; 1. 定义 线性回归是一种用于回归问题的算法&#xff0c;旨在找到输入特征与输出值之间的线性关系。它试图通过拟合一条直线来最小化预测值与真实值之间的误差。 2. 模型表示 线性回归模型假设目标变量&#xff08;输…

Vue3浮动按钮(FloatButton)

效果如下图&#xff1a;在线预览 APIs FloatButton 参数说明类型默认值left按钮定位的左边距&#xff0c;单位 pxnumber | stringundefinedright按钮定位的右边距&#xff0c;单位 pxnumber | string24top按钮定位的上边距&#xff0c;单位 pxnumber | stringundefinedbottom…

优惠点餐api接口对接的具体步骤是什么?

优惠点餐API接口对接的具体步骤通常包括以下几个阶段&#xff1a; 需求分析&#xff1a;明确对接的目标和需求&#xff0c;例如实现在线点餐、订单管理、支付集成等 。选择API服务提供商&#xff1a;根据业务需求选择合适的点餐API服务提供商 。注册和获取API密钥&#xff1a;…

channel是pypi与 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-f的区别。

pypi.org 是 PyPI 的默认源https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-f 是清华大学开源软件镜像站提供的 Anaconda 镜像源之一。 pypi.org&#xff1a;通常通过 pip 工具来使用。 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-f&#xff1a;…

力扣HOT100合集

力扣HOT100 - 1. 两数之和 解题思路&#xff1a; 解法一&#xff1a;暴力 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i)for (int j i 1; j < n; j) {if (target nums[i] nums[j])return new int[] …