秋招突击——6/16——复习{(单调队列优化DP)——最大子序和,背包模型——宠物小精灵收服问题}——新作{二叉树的后序遍历}

news2024/10/7 1:27:36

文章目录

    • 引言
    • 复习
      • (单调队列优化DP)——最大子序和
        • 单调队列的基本实现思路——求可移动窗口中的最值
        • 总结
      • 背包模型——宠物小精灵收服问题
        • 思路分析
        • 参考思路分析
    • 新作
      • 二叉树的后续遍历加指针调换
    • 总结

引言

复习

(单调队列优化DP)——最大子序和

  • 这个已经是第二天做了,昨天基本上已经做了很多推理,今天就要把这道题完成,下述是昨天的学习的链接
  • 单调递增队列的推理
  • 昨天经过推理,知道了要将这个问题进行转换,由原先的特定长度和的最大值,转成求特定长度和的最小值。然后通过画图证明了,为什么要通过单调队列实现最小值的计算。
  • 今天主要是关注代码的执行。
单调队列的基本实现思路——求可移动窗口中的最值
  • 使用队列维系一个集合m
  • 将无用的元素从后往前进行排除,保证队列是一个单调递增的队列
  • 找出最大值或者最小值

在这里的队列保存的元素是的特定序列的累加和,不是具体的元素的大小,保证单调递增!!

  • 这个代码不是那么好懂,我自己再写一遍。
#include <iostream>

using namespace std;

typedef long long LL;
const int N = 300010;
int q[N],s[N];
int n,m;

int main(){
    cin>>n>>m;
    for (int i = 1; i <= n ; ++i) {
        cin>>s[i];
        s[i] += s[i - 1];
    }

    // 创建对应的队列
    int hh = 0,tt = 0,res = INT_MIN;
    q[hh] = 0;
    for (int i = 1; i <= n; ++i) {
        // 保证队列的长度不变
        if (i - hh > m) hh++;
        // 计算最值
        res = max(res , s[i] - s[q[hh]]);
        
        // 更新的队列尾部
        // 队列可为空,也就是tt >= hh
        // 然后就是保证队列是单调递增的,如果出现新的值小于后续的值,
        // 就要将所有比之大的数据排除,因为是一个序列,一定会选中这个数据
        while(tt >= hh && s[q[tt]] > s[i]) tt --;
        // 移动到一个小于或者等于的数字之后,tt再往后移动一个,即将新的排序值,加入其中。
        q[++tt] = i;        
    }
    
    cout<<res;
}
总结
  • 重新写了一遍,效果好多了,并没有像之前那么难以理解了,主要有两个地方需要好好整理一下,分别是
    • 这里的单调递增是针对S,也就是每一个前序和来说的,不是针对特定的某一个元素说的。
    • 这里使用一个数组模拟队列,hh模拟队列的头指针,tt模拟队列的尾指针
      • hh头指针只需要保证是最小值,并且队列的长度不超过m
      • tt尾指针需要覆盖新的元素,保证整个队列是单调递增的,因为这是一个序列和,如果后续的序列和比前面的小,那么最终就不一定不会选择前面的序列和。

背包模型——宠物小精灵收服问题

在这里插入图片描述
在这里插入图片描述

思路分析
  • 这道题是经典的背包模型问题,收服的精灵就是要求在特定空间下装的货越多,然后的皮卡丘收到的伤害就是代价越小越好,

  • 每一个状态的集合,主要分为两个部分,收取当前的精灵和不收取当前的精灵,而且要同时满足两个约束的,就是最多收服精灵的个数,皮卡丘最少收到的伤害,不过究竟哪个更加重要?明白了,尽可能多的精灵,然后同样多的情况下,保证尽可能多的剩余体力。所以,这里要两个矩阵

    • 一个保存数量,这个属性值,也是dp的主要目标
    • 另外一个保存剩余的体力值,这个用来后续判断
  • 感觉有点不对,这里是不是要再增加一个新的遍历条件,也就是体力值?如果不增加就没有意义了。

  • 暂时实现成这样了,还有点问题,不过时间不够了,直接看代码了

#include <iostream>

using namespace std;

const int N = 1010,M = 505,K = 105;  // N是精灵球的数量,M是皮卡丘的体力值,K是野生小精灵的数量
int f[K][N],mr[K][N],n1[K],m1[K];
int n,m,k;
int main(){
    cin>>n>>m>>k;
    for (int i = 1; i < k; ++i) {
        cin>>n1[i]>>m1[i];
    }

    // 遍历对应的数据
    for (int i = 1; i < k; ++i) {
        for (int j = 0; j < N; ++j) {
            f[i][j] = 0;
            // 两种状态,
            // 一种是收服当前的精灵,f[i-1][j - n1[i]] + 1
            // 判定当前剩余的体力以及精灵球的数量是否满足要求
            if (m >= m1[i] && k >= n1[i])
                f[i][j] = f[i-1][j - n1[i]] + 1;

            // 另外一种是不收服当前的精灵,f[i-1][j]
            int temp = f[i-1][j];
            if (temp > f[i][j]){
                // 不收服的结果大于当前的结果
                f[i][j] = temp;
            }else{
                m -= m1[i];
                n -= n1[i];
            }
        }
    }

    // 输出最终的结果,遍历一下

}
参考思路分析
  • 这里是二维背包问题,需要考虑两个维度,所以我上面的思路有问题,应该使用二维背包去解决这个问题。
  • 这里先直接贴代码,参考分析一下
    • 二维背包,然后使用滚动数组进行优化
    • 然后遍历最后一个维度下,精灵球最多的情况下,体力值消耗最小的情况。
  • 还是得看看之前的背包问题咋写的,一维和二维之间的相互转换。
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 1010, K = 510;

int n, m, t;
int v1[N], v2[N];
int f[M][K];

int main()
{
    //input
    cin >> m >> t >> n;
    for (int i = 1; i <= n; ++ i) cin >> v1[i] >> v2[i];

    //dp
    for (int i = 1; i <= n; ++ i)
    {
        for (int j = m; j >= v1[i]; -- j)
        {
            for (int k = t - 1; k >= v2[i]; -- k)
            {
                f[j][k] = max(f[j][k], f[j - v1[i]][k - v2[i]] + 1);
            }
        }
    }

    //output
    cout << f[m][t - 1] << " ";
    //找到满足最大价值的所有状态里,第二维费用消耗最少的
    int cost_health = t;
    for (int k = 0; k <= t - 1; ++ k)
    {
        if (f[m][k] == f[m][t - 1])
        {
            cost_health = min(cost_health, k);
        }
    }
    cout << t - cost_health << endl;
    return 0;
}

作者:一只野生彩色铅笔
链接:https://www.acwing.com/solution/content/52741/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

新作

  • 今天晚上会进行的某公司的主管面,今天新做的题目就是主管面的手撕算法题。

二叉树的后续遍历加指针调换

  • 这道题吃亏在于我没有看清楚题目,没有理解他的题目,我觉得他说的比较混乱,而且有一个东西感觉没有任何意义。
  • 不过我也发现我的问题了,二叉树定义哪里有问题,没有实现的好。
  • 下面是我写的, 大概是写对的
#include <iostream>
#include <vector>
using namespace std;

struct  Node{
    int val;
    Node* left;
    Node* right;
    Node(int x):val(x),left(NULL),right(NULL){};
};

vector<int> res;

void dfs(Node* root){
    if (root->left) dfs(root->left);
    if (root->right) dfs(root->right);
    res.push_back(root->val);
}

int main(){
    Node* root =new Node(1);
    dfs(root);
    for(int i = 0;i < res.size();i ++)
        cout<<res[i]<<",";
    delete root;
}

针对第二个问题,表述如下

  • 要将二叉树的左右子节点更换为后序遍历中的左右子节点,并且更改之后的结果可能不是一个树,甚至有可能成为其他结构。

  • 其实我蛮不能理解他的用意的,究竟是让我干什么?把一个二叉树的左右子节点变为后续遍历顺序中的节点,那么指针的方向有没有改变?然后,构建出来是什么样?原来的结构还要保存吗?

  • 如果只是单纯换一个方式,不就是在创建一个后序遍历的链表吗?把每一个节点都加进去不就行了吗?

  • 现在还不是很懂这个题目

  • 下面是ChatGPT写的,感觉没有什么意义。

#include <iostream>
#include <vector>

struct Node {
    int val;
    Node* left;
    Node* right;
    Node(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 后序遍历,记录节点访问顺序
void postOrderDFS(Node* root, std::vector<Node*>& nodes) {
    if (root == nullptr) {
        return;
    }
    postOrderDFS(root->left, nodes);
    postOrderDFS(root->right, nodes);
    nodes.push_back(root);
}

// 根据后序遍历的节点顺序调整左右子节点
void adjustNodes(std::vector<Node*>& nodes) {
    for (size_t i = 0; i < nodes.size() - 1; ++i) {
        nodes[i]->left = nullptr;
        nodes[i]->right = nodes[i + 1];
    }
    nodes.back()->left = nullptr;
    nodes.back()->right = nullptr;
}

// 辅助函数:中序遍历打印二叉树
void inOrderPrint(Node* root) {
    if (root == nullptr) {
        return;
    }
    inOrderPrint(root->left);
    std::cout << root->val << " ";
    inOrderPrint(root->right);
}

// 辅助函数:后序遍历打印二叉树
void postOrderPrint(Node* root) {
    if (root == nullptr) {
        return;
    }
    postOrderPrint(root->left);
    postOrderPrint(root->right);
    std::cout << root->val << " ";
}

int main() {
    // 创建一个简单的二叉树
    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    root->left->right = new Node(5);
    root->right->left = new Node(6);
    root->right->right = new Node(7);

    std::cout << "Original tree (in-order): ";
    inOrderPrint(root); // 预期输出: 4 2 5 1 6 3 7
    std::cout << std::endl;

    std::cout << "Original tree (post-order): ";
    postOrderPrint(root); // 预期输出: 4 5 2 6 7 3 1
    std::cout << std::endl;

    // 后序遍历并记录节点顺序
    std::vector<Node*> postOrderNodes;
    postOrderDFS(root, postOrderNodes);

    // 根据后序遍历顺序调整节点
    adjustNodes(postOrderNodes);

    std::cout << "Adjusted structure (in-order): ";
    inOrderPrint(root); // 可能无法正确打印,因为树结构已改变
    std::cout << std::endl;

    std::cout << "Adjusted structure (post-order): ";
    postOrderPrint(root); // 预期输出与原后序遍历顺序一致
    std::cout << std::endl;

    return 0;
}

总结

  • 面试很难受,不过我尽力了,算法也复习到了。不过反映出我的问题,就是很多东西看的不够细致,不够深入,先过一遍,后续再继续深化。时间不是很够,加油。

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

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

相关文章

Qt实现单例模式:Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS

目录 1.引言 2.了解Q_GLOBAL_STATIC 3.了解Q_GLOBAL_STATIC_WITH_ARGS 4.实现原理 4.1.对象的创建 4.2.QGlobalStatic 4.3.宏定义实现 4.4.注意事项 5.总结 1.引言 设计模式之单例模式-CSDN博客 所谓的全局静态对象&#xff0c;大多是在单例类中所见&#xff0c;在之前…

使用ant-design/cssinjs向plasmo浏览器插件的内容脚本content中注入antd的ui组件样式

之前写过一篇文章用来向content内容脚本注入antd的ui&#xff1a;https://xiaoshen.blog.csdn.net/article/details/136418199&#xff0c;但是方法就是比较繁琐&#xff0c;需要将antd的样式拷贝出来&#xff0c;然后贴到一个单独的css样式文件中&#xff0c;然后引入到内容脚…

20个超实用的VS Code扩展(2024年版)

大家好&#xff0c;今天小程给大家带来一篇关于 VS Code 扩展的文章。VS Code 这几年做得是风生水起&#xff0c;可以算得上是微软的良心产品&#xff0c;其最大的优势就是拥有众多高质量的扩展。在本文中&#xff0c;将向大家推荐一些我认为在 2024 年对开发者来说又实用又好用…

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(分布式协议)

探索分析从起源到现今的巅峰之旅2 前提回顾最终一致性Clock时钟机制局限性 CAP协议CAP理论的三要素A和C机制的保障P分区容错性AP机制的保障CP机制的保障 分布式系统方向 分布式系统之ZookeeperZK的作用和职责协调服务命名服务构建高可靠服务 ZK的常见用法ZK基本原理ZK的顺序一致…

将粘贴文本进输入框中时不带有任何格式(包括背景颜色和字体)解决办法

只需要四行代码解决&#xff0c;这里用到vue3里面的事件 paste"" 代码块&#xff1a; <div paste"handlePaste"></div>//粘贴文本时不带有任何格式&#xff08;包括背景颜色和字体&#xff09;function handlePaste(event) {event.preventDef…

【计算机毕业设计】234基于微信小程序的中国各地美食推荐平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【数据分析】用Python做事件抽取任务-快速上手方案

目录 方法一&#xff1a;使用OmniEvent库安装OmniEvent使用OmniEvent进行事件抽取OmniEvent优点缺点 方法二&#xff1a;使用大模型使用GPT网页版进行事件抽取事件类型列表 大模型优点缺点 总结 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;事件抽取是一项关键任…

多组学双疾病串扰怎么做?PAN-AD九个机器学习+MR+单细胞,工作量不少

说在前面 “串扰”这个名词听起来高级了一个level&#xff0c;其实就是MR-通路的双疾病联合分析。虽然是筛选标志物的思路&#xff0c;但是工作量不小&#xff0c;作者还收集了13个不同AD自身免疫疾病数据集用于验证自己的机器学习模型&#xff0c;分析就是一些常规的WGCNA、P…

基于sass模式Java语言+MySQL + MyCat开发的his系统源码 HIS系统住院业务流程 HIS系统住院流程化管理

基于sass模式Java语言MySQL MyCat开发的his系统源码 HIS系统住院业务流程 HIS系统住院流程化管理 HIS系统住院业务&#xff0c;该系统为医院提供了一套完整的住院业务流程解决方案&#xff0c;旨在提高住院管理的效率和精确度。通过HIS系统&#xff0c;医院工作人员可以某轻理…

DzzOffice集成功能最丰富的开源PHP+MySQL办公系统套件

DzzOffice是一套开源办公套件&#xff0c;旨在为企业和团队提供类似“Google企业应用套件”和“微软Office365”的协同办公平台。以下是对DzzOffice的详细介绍&#xff1a; 主要功能和应用&#xff1a; 网盘&#xff1a;支持企业、团队文件的集中管理&#xff0c;提供文件标签…

Oracle 是否扼杀了开源 MySQL

Oracle 是否无意中扼杀了开源 MySQL Peter Zaitsev是一位俄罗斯软件工程师和企业家&#xff0c;曾在MySQL公司担任性能工程师。大约15年前&#xff0c;当甲骨文收购Sun公司并随后收购MySQL时&#xff0c;有很多关于甲骨文何时“杀死MySQL”的讨论。他曾为甲骨文进行辩护&#…

攻防演练“轻装上阵” | 亚信安全信舱ForCloud 打造全栈防护新策略

网络世界攻防实战中&#xff0c;攻击风险已经从代码到云横跨全栈技术点&#xff0c;你准备好了吗 云服务器&#xff0c;攻击众矢之的 2022年超过38万个Kubernetes API服务器暴露公网&#xff0c;成为攻击者目标。云服务器&#xff0c;尤其是开源设施&#xff0c;一直以来不仅是…

物理隔离后数据怎么导入和导出?安全U盘一键解决

政府单位、军工和科研所、航空航天企业、金融机构、医疗单位、电力企业、生物制药实验室等企业及单位&#xff0c;因研发和生产过程、或日常经营中涉及大量敏感信息和技术&#xff0c;需要通过物理隔离来确保网络的安全性。因此&#xff0c;多采用物理隔离的方式进行网络建设。…

【Unity实战篇】| 快速制作一个简易时钟,包括2D和3D时钟

前言 【Unity实战篇】| 快速制作一个时钟&#xff0c;包括2D和3D时钟一、2D时钟制作1.1 钟表盘制作1.2 指针制作1.3 钟表搭建1.4 设置时钟的中心点1.5 时钟旋转逻辑 二、3D时钟制作2.1 搭建表盘和指针2.2 调整指针的位置和节点2.3 时钟旋转逻辑 总结 前言 时钟 这个东西想必不…

租房项目之并发缺失数据问题

前奏&#xff1a;本项目是一个基于django的租房信息获取项目。本次博客牵扯到两个版本&#xff0c;集中式分布以及分布式部署&#xff08;两个版本的ui不同&#xff0c;集中式用的是老版ui&#xff0c;分布式使用的是新版ui&#xff09;&#xff1b; 项目链接&#xff1a;http…

Peewee,一个既小巧又强大的 Python 库-轻松实现数据库的增删改查

目录 01初识 Peewee 为什么选择 Peewee? 02安装与配置 安装 Peewee 配置 Peewee 03定义模型 定义简单模型 定义复杂模型 04基本操作 创建记录 查询记录 更新记录 删除记录 05高级操作 复杂查询 事务处理 使用信号 模型迁移 06实战案例 简单博客系统 任务管…

2024年金地杯山西省大学生数学建模竞赛B题D题论文代码分析

2024金地杯数学建模B题和金地杯数学建模D题32页论文和代码已完成&#xff0c;代码为B题D题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求…

elasticsearch过滤器filter:原理及使用

码到三十五 &#xff1a; 个人主页 目录 一、引言二、Elasticsearch的过滤器概述三、使用DSL进行过滤操作术语过滤范围过滤复合过滤 四、优化策略五、结语 一、引言 Elasticsearch是一个功能强大的开源搜索引擎&#xff0c;广泛应用于各种数据检索和处理场景。在Elasticsearch…

C++ | Python气泡表面张力和预期形态及上升速度数值模型

&#x1f4dc;模型-用例 &#x1f4dc;流体力学&#xff1a;C风流和MATLAB | Python | CUDA 库埃特流泊肃叶流薄膜流体 | &#x1f4dc;神经网络&#xff1a;Python捕捉重叠气泡单体运动&#xff0c;算法测速 ✒️C风成和风蚀建模 风成过程是指由风在地表或近地表引起的侵蚀…