【刷题汇总 -- 游游的重组偶数、体操队形、二叉树中的最大路径和】

news2025/5/19 4:25:39

C++日常刷题积累

  • 今日刷题汇总 - day028
    • 1、游游的重组偶数
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现
    • 2、体操队形
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现 -- 递归(dfs) + 剪枝
    • 3、二叉树中的最大路径和
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现 -- 递归+树形dp
    • 4、题目链接

今日刷题汇总 - day028

1、游游的重组偶数

1.1、题目

在这里插入图片描述

1.2、思路

读完题,知道让处理q组数据,让其重新排位,让这个数变成偶数,且不能有前导零,且重排后可与原数相等,如果重排后能成为偶数则输出,若无法成为偶数,则输出-1即可。那么,这个问题就成为如何判断偶数的问题,第一个方式就是判断这个数能够被2整除,第二个方法判断个位上的数是不是偶数即可。此外,由于我们老实的输入数字去摸得到每一位上的数比较麻烦,所以这里就利用string转数字提取每一位即可,再然后还有一些细节需要注意处理,那么接下来,就是程序实现。

1.3、程序实现

首先,按照思路和题目要求利用string输入每一组的数据number,然后遍历字符串如果是偶数就与最后的和个位交换,然后如果交换成功最后一位就是偶数,则满足条件,如果遍历完都没有执行交换说明就不是偶数,则输出-1。其中值得注意的细节就是,遍历选择从末尾开始遍历解决,这个数本身就是偶数如24时,然后如果从前遍历也会交换变成42,输出42与题目输出不匹配通过不了。所以就直接采用从末尾判断交换即可。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int q;
    cin >> q;
    string number;

    while (q--)
    {
        cin >> number;
        int len = number.size();
        int flag = 0;
        for(int i = len - 1;i >= 0;i--)
        {
            if((number[i]-'0') % 2 == 0)
            {
                swap(number[i],number[len-1]);
                flag = 1;
                break;
            }
        }
        if(flag)
            cout << number << endl;
        else
            cout << -1 << endl;
    }
    return 0;
}

在这里插入图片描述

2、体操队形

2.1、题目

在这里插入图片描述

2.2、思路

读完题知道,就是让处理体操队员的排队问题,需要满足位置与队员需求,其中对于第 i 个队员的需求a[i]表示想要排在a[i]队员位置的前面,比如2号队员的需要a[3]表示想要排在a[2]位置,如果2号需求正好就是a[2]那么表示该队员没有位置需求,可任意分配即可。最后求满足所有队员的排队的方案有多少种?那么为了直观的理解画个图:
在这里插入图片描述
综上所述就是:根据题目中的队员位置需求与位置是否被占进行递归减治策略,采用dfs依次搜索合法位置就入队,知道所有队员全部放入即可。那么,接下来就是程序实现。

2.3、程序实现 – 递归(dfs) + 剪枝

根据思路分析的递归思想和减治策略实现,首先按照题目要求输入这里采用全局方便使用和输出结果,然后主要是完善dfs,这里同样是利用全局的特性,可以理解为直接一位一位的判断处理,所以主函数直接给第一个位置即可,然后dfs函数体中,如果当前位置越界那么就直接返回输出ret即可。其中题目中2 <= n <= 10;接着,遍历递归剩余位置,且利用bool vis数组判断队员是否已入队,且判断vis[arr[i]]队员的需求是否已经被满足了,如对于上图中第二个情况的第四组情况中,4号要求在2号前面,但是2号已经入队了就不满足,则都采用剪枝减去多余重复的操作,最后是合法的就进入标记,继续第二个位置递归。值得注意的是,执行恢复现场,因为上图思路分析中对于情况二发现到后面属于都不满足条件,无法有方案的,所以需要恢复到情况3的形式继续递归判断,搜索是否具有合法方案。

#include <iostream>
using namespace std;

const int N = 15;
int n,ret;
int arr[N];
bool vis[N];

void dfs(int pos)
{
    if(pos == n+1)//说明遍历完,所有队员都合法入队
    {
        ret++;//方案+1
        return;
    }
    for(int i = 1;i <= n;i++)
    {
        //剪枝
        if(vis[i])//当前队员已入队了
            continue;
        if(vis[arr[i]])//当前队员的需求不满足,因为vis说明arr[i]需求的队员已经入队。
            return;
        //说明当前合法,则进行标记
        vis[i] = true;
        dfs(pos + 1);//继续下个位置
        //注意:恢复现场,因为当前位置不合法时,需要将当前位置腾出来,才能让下一个队员进行递归判断
        vis[i] = false;
    }
}

int main()
{
    cin >> n;
    for(int i = 1;i <= n;i++)
        cin >> arr[i];
    
    dfs(1);
    
    cout << ret << endl;
    return 0;
}

在这里插入图片描述

3、二叉树中的最大路径和

3.1、题目

在这里插入图片描述

3.2、思路

读完题知道,二叉树里面的路径被定义为:从该树的任意节点出发,经过父=>子或者子=>父的连接,达到任意节点的序列。
注意:
1.同一个节点在一条二叉树路径里中最多出现一次
2.一条路径至少包含一个节点,且不一定经过根节点
那么给定一个二叉树的根节点root,请你计算它的最大路径和。
通过题目和示例分析,总结题目的概念就是一句话,就是将这棵树中画一条不会回溯的路线,求路线中最大路径和。如图:
在这里插入图片描述
那么由于路径是不定长且存在负数的情况,思考和分析以下几个要点:
(1)、要明白如何遍历树更适用?采用后序遍历,由左右子树汇集根节点更方便统计;
(2)、由于不不能回溯的所以这里的左右子树的路径和,实际上是一条单链和;
(3)、返回分为四种情况:
a、左右子树都是正数,则左+右+根的总和为最大路径和;
b、左子树和为负数,右子树和为正数,则返回右子树的和 + 根的和与只要右子树的路径相比的最大值,即max(右+根,右);因为根结点的值可能为负数;
c、同理,左子树和为正数数,右子树和为负数,则max(左+根,左);
d、左右子树都为负数,则返回与根结点的比较,max(根,max(左,右));
接下来,就是程序实现。

3.3、程序实现 – 递归+树形dp

综上所述总结为树形dp:
a. 左⼦树收集:以左⼦树为起点的最⼤单链和;
b. 右⼦树收集:以右⼦树为起点的最⼤单链和;
c. 根节点要做的事情:整合左右⼦树的信息,得到经过根节点的最⼤路径和;
d. 向上返回:以根节点为起点的最⼤单链和

class Solution
{
  public:
    int ret = -1010;
    int dfs(TreeNode* root)
    {
        if (root == nullptr) 
            return 0;
        int left = max(0, dfs(root->left));// 左⼦树的最⼤单链和,max 0去除负数
        int right = max(0, dfs(root->right)); // 右⼦树的最⼤单链和
        // 经过root的最⼤路径和
        ret = max(ret, root->val + left + right);
        return root->val + max(left, right);
    }
    int maxPathSum(TreeNode* root)
    {
        dfs(root);
        return ret;
    }
};

在这里插入图片描述

在这里插入图片描述

4、题目链接

🌟游游的重组偶数
🌟体操队形
🌟二叉树中的最大路径和

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

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

相关文章

快递进小区太难了!大量快递到底放在哪里?

如今&#xff0c;快递小哥是市民生活中不可或缺的角色&#xff0c;但他们在服务城市、满足市民需求的同时&#xff0c;也会遇到一些不被居民理解的情况。 “为什么不让进小区” “一些高档小区管得严&#xff0c;不让我们快递员进小区送货&#xff0c;但是这个标注是送货上楼的…

Netty 必知必会(四)—— Channel-Pipeline 责任链

一、责任链模式 适用场景: 对于一个请求来说&#xff0c;如果每个对象都有机会处理它&#xff0c;而且不明确到底是哪个对象会处理请求时&#xff0c;我们可以考虑使用责任链模式实现它&#xff0c;让请求从链的头部往后移动&#xff0c;直到链上的一个节点成功处理了它为止 …

openeuler的mariadb数据库安装

下载数据库 yum install mariadb-server 如果出现文件冲突如下删除即可 yum remove selinux-policy-targeted --nobest --nobest 无视需求关系 systemctl enable --now mariadb.service #自启动 mysql_secure_installation 初始化Mysql根据自己需求填y|n 第一次进…

运动耳机界的“冠军之选”!奥运会冠军同款耳机曝光!

近期&#xff0c;相信大家的目光都被奥运会所吸引&#xff0c;作为一个有着多年使用蓝牙耳机经验的专业测评师&#xff0c;在此告诉大家&#xff0c;其实有很多奥运会选手在训练的时候会戴耳机&#xff0c;因为这样不仅可以缓解训练中的疲惫&#xff0c;而且可以增加训练的激情…

Docker Compose方式部署Ruoyi-前后端分离版本

目录 一. 环境准备 二. 制作一个jdk8u202环境的镜像 三. 制作nginx镜像 四. 对项目文件做修改 五. 项目打包 1. 前端打包 2. 后端打包 六. 编写docker-compose.yml 一. 环境准备 主机名IP系统软件版本配置信息localhost192.168.226.25Rocky_linux9.4 git version 2.4…

InfluxDB的安装与使用

目录 1.influxDB的下载地址&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb-1.8.3_windows_amd64.zip 2.在D盘创建一个influxDB的文件夹 3. 在安装目录输入cmd,执行influxd.exe 4.启动成功 5.下载nssm安装相关服务&#xff0c;下载地址https://nssm.cc/…

Xinstall全渠道统计服务,轻松掌握App用户全生命周期数据

在当今数字化时代&#xff0c;App的推广和运营显得尤为重要。然而&#xff0c;面对复杂多变的推广渠道和用户行为&#xff0c;如何精准地评估渠道效果、提升获客能力&#xff0c;成为了众多App运营者面临的难题。此时&#xff0c;Xinstall作为一站式App全渠道统计服务商&#x…

大麦网抢票攻略:使用Python Selenium实现

随着互联网技术的发展&#xff0c;在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而&#xff0c;面对热门活动&#xff0c;门票往往在开售瞬间被抢购一空。为了解决这一问题&#xff0c;本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…

Linux线程1

守护进程 1.守护进程的特点 后台服务进程 独立于控制终端 周期性执行某任务 不受用户登录注销影响 一般采用以d结尾的名字&#xff08;服务&#xff09; 2 . 进 程 组 进程的组长 组里边的第 一 进程 进 程 组 的ID 进 程 中 的 组 长 的ID 进 程 中 组 长 的 选 择 …

SQL注入——搜索型注入

搜索型注入——原理介绍 一些网站为了方便用户查找网站的资源&#xff0c;都对用户提供了搜索的功能&#xff0c;因为是搜索功能&#xff0c;往往是程序员在编写代码时都忽略了对其变量(参数)的过滤&#xff0c;而且这样的漏洞在国内的系统中普遍的存在; 其中又分为 POST/GET…

实验2-5-2 生成3的乘方表

//实验2-5-2 生成3的乘方表//输入一个非负整数n&#xff0c;生成一张3的乘方表&#xff0c;输出30~3n的值。可调用幂函数计算3的乘方。 #include<stdio.h> #include<math.h> int main(){int n;int num0;scanf("%d",&n);//输入在一行中给出一个非负整…

Opencv threshold函数、adaptiveThreshold函数详解和示例

1.threshold函数 double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type ) src&#xff1a;待二值化的图像&#xff0c;图像只能是 CV_8U 和 CV_32F 两种数据类型。对于图像通道数目的要求与选择的二值化方法相关。dst&#xff1a;…

全球汽车橡胶减震支架市场规划预测:未来六年CAGR为2.5%

随着汽车行业的持续发展和消费者对驾驶舒适性的需求增加&#xff0c;汽车橡胶减震支架作为提升车辆稳定性和乘坐舒适性的关键组件&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车橡胶减震支架行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场…

反序列化靶机serial漏洞复现 超详细教程

环境搭建 漏洞环境&#xff1a;https://www.vulnhub.com/entry/serial-1,349/ 下载后使用Vmware打开 创建新的虚拟机&#xff1a; 选择客户机版本为Ubuntu 64位&#xff1a; 一直下一步&#xff0c;知道选择使用现有磁盘&#xff1a; 选择下载的vmdk磁盘文件&#xff1a; 开机…

生信技能55 - WisecondorX分析结果过滤和质控

WisecondorX分析CNV,对每条染色的CNV loss和gain进行分组,对每个组求ratio平均值和zscore平均值,基于该数值对CNV进行质控和过滤,并对连续的CNV进行合并,获得可信的CNV。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动…

利用扩散模型的反馈优化图片理解模型

利用扩散模型的反馈优化图片理解模型 自从 DDPM 以来&#xff0c;扩散模型已经成为了绝对主流的图片生成模型。最近&#xff0c;有研究者开始探索如何将扩散模型的生成能力用于提升判别模型的能力。主要有三种用法&#xff1a;生成模型反演用作判别模型、生成模型用于数据增强…

案例分享—国外优秀UI设计作品

国外 UI设计作品之所以出色&#xff0c;首先在于它们对用户体验的极致追求。设计师们深入了解用户需求&#xff0c;通过细腻的界面布局、直观的交互逻辑和丰富的视觉元素&#xff0c;打造出让用户爱不释手的作品。同时&#xff0c;他们勇于创新&#xff0c;不断尝试新的设计理念…

说说你们出来打工转了几个行业?

先说说我吧&#xff0c;大学毕业出来就从事智能交通刷卡方面&#xff0c;后来又从事多年的自动化控制&#xff0c;接着又做智能停车系统&#xff0c;接着又做医疗&#xff0c;美容仪器&#xff0c;仪器仪表&#xff0c;开关电源……做的有点杂&#xff0c;你们呢&#xff1f;一…

旧版本的Oracle OCM证书怎么升级到最新版本?

一、先来说一下OCM认证&#xff0c;全称是&#xff1a;Oracle Certified Master - Oracle认证大师&#xff0c;是Oracle数据管理员的最高级别的认证。 有了OCM证书&#xff0c;可以证明你的专业能力&#xff0c;是 Oracle 数据库管理方面具备高级和全面技能的权威认证。在竞争…

好用的抠图小技巧

在ps里的抠图方法 方法一&#xff1a;直接在菜单栏里选择主体&#xff0c;选中主体后会出现蚂蚁线&#xff0c;这个时候可能选区还不够完整&#xff0c;需要借助快速选择工具细化选取&#xff0c;选好之后按ctrlj复制选区就抠好啦 方法二&#xff1a;用快速选择工具直接选取人…