当前位置: 首页 > article >正文

贪心算法-Huffman树 不等式 推公式

题目一

在这里插入图片描述

解题思路

算法
(贪心,哈夫曼树,堆,优先队列) O(nlogn)
𝑂(𝑛𝑙𝑜𝑔𝑛)
经典哈夫曼树的模型,每次合并重量最小的两堆果子即可。

时间复杂度
使用小根堆维护所有果子,每次弹出堆顶的两堆果子,并将其合并,合并之后将两堆重量之和再次插入小根堆中。每次操作会将果子的堆数减一,一共操作 n−1次即可将所有果子合并成1堆。每次操作涉及到2次堆的删除操作和1次堆的插入操作,计算量是 O(logn)。因此总时间复杂度是 O(nlogn)

代码实现

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

using namespace std;

int main()
{
    int n;
    cin >> n;
    priority_queue<int, vector<int>, greater<int>> heap;
    
    while (n -- )
    {
        int x;
        scanf("%d", &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;
    return 0;
}

题目二

在这里插入图片描述

解题思路

打水时间最小的人先打水,总等待时间最短,解题思路与题一相同

代码实现

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

using namespace std;

int main()
{
    int n;
    cin >> n;
    priority_queue<long long, vector<long long>, greater<long long>> heap;
    
    while (n --)
    {
        long long x;
        scanf("%lld", &x);
        heap.push(x);
    }
    
    long long total = 0;
    while(!heap.empty())
    {
        long long a = heap.top();
        heap.pop();
        total += a * heap.size();
    }
    
    cout << total;
    return 0;
}

题目三

在这里插入图片描述

解题思路

将地址排序,取中位数作为货舱,总距离最小
为什么不是去平均数作为地址?
在这里插入图片描述

代码实现

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;
int a[N];

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++)
    {
        scanf("%d", &a[i]);
    }
    
    sort(a, a + n);
    int loc = a[n / 2];
    
    int dis = 0;
    for (int i = 0; i < n; i ++)
    {
        dis += abs(a[i] - loc);
    }
    
    cout << dis;
    return 0;
}

题目四

在这里插入图片描述

解题思路

思路: 与国王游戏的贪心策略相似, 我们先分析

每头牛的危险值 = 他前面牛的w(重量值)之和 - 自身的s(强壮值)
要使每头牛的危险值最小,根据贪心思想:

自身w值越大应该放到底部(即减小上述式中的被减数)

自身s值越大应该放到底部(即增大上述式中的减数)

所以先 yy 出一种贪心做法 每头牛的(w + s)值越大应该排在后面,即升序排序(题见多了可能就会有这种题感)。

代码实现

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 5e4 + 10;

typedef long long LL;
typedef pair<LL, LL> PII;

PII a[N];

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++)
    {
        LL w, s;
        scanf("%lld%lld", &w, &s);
        a[i].first = w + s, a[i].second = s;
    }
    
    sort(a, a + n);
    
    LL sum = 0, res = -1e18;
    for (int i = 0; i < n; i ++)
    {
        sum -= a[i].second;//减去当前牛的强壮值
        res = max(res, sum);//风险值最大的可能是中间的牛,所以每次都要用max才能取得全部牛中风险值最大的牛
        sum += a[i].first;//相当于sum只加了当前牛的重量
    }
    
    cout << res;
    return 0;
}

http://www.kler.cn/a/415068.html

相关文章:

  • 【OpenGL】延迟着色和G缓冲
  • 透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)
  • 【Bug】el-date-picker组件时间差
  • 【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)
  • 【SpringBoot】28 API接口防刷(Redis + 拦截器)
  • css:项目
  • iscsi服务器
  • [问题记录] Android裁剪Provision应用后无法打开开发者选项
  • 基于Linux操作系统的DNS服务器实验
  • python网络爬虫进阶
  • 全面解析LLM业务落地:RAG技术的创新应用、ReAct的智能化实践及基于业务场景的评估框架设计
  • 开发一套ERP 第七弹 RUst 操作数据库
  • 全国1000米分辨率逐月植被覆盖度(FVC)数据集(2000-2024)
  • 网络安全——--网络安全的基本概念--病毒防护--入侵检测技术与防火墙--虚拟专用网
  • C#里怎么样使用继承实现不同的功能,以及调用基类函数?
  • 在Linux中备份msyql数据库和表的详细操作
  • 【ChatGPT大模型开发调用】如何获得 OpenAl API Key?
  • Linux系统管理基础指南--习题
  • Python3 爬虫 Scrapy的安装
  • Docker容器ping不通外网问题排查及解决
  • 【uniapp】轮播图
  • 力扣整理版十:动态规划(待更新)
  • 【CLIP】3: semantic-text2image-search允许局域网访问
  • 卷积神经网络实现图像分类
  • 【HF设计模式】01-策略模式
  • 【Linux | 计网】TCP协议详解:从定义到连接管理机制