【C++笔试强训】如何成为算法糕手Day2


db43723fcefb47a09b575a7812877e29.png


 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台  

 循环渐进Forward-CSDN博客


目录

 循环渐进Forward-CSDN博客

第一题:牛牛的快递

第二题:最小花费爬楼梯

第三题:数组中两个字符串的最小距离

补充0x3f3f3f3f



第一题:牛牛的快递

牛客网做题链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com)

思路:
读题可知总共有四种解决方式

(1)快递不加急且小于20kg;
(2)快递加急且小于20kg;
(3)快递不加急且大于20kg;
(4)快递加急且大于20kg;

#include <iostream>
using namespace std;

int main()
{
    float a = 0;
    char b = 0;
    int count = 0;
    cin >> a >> b;
    if(a < 1 && b == 'n')
        cout << 20;
    else if(a < 1 && b == 'y')
        cout << 25;
    else if(a>=1 && b == 'n')
    {
        while(--a > 0)
        {
            count++;
        }
        cout << 20 + count;
    }
    else if(a>=1 && b == 'y')
    {
        while(--a > 0)
        {
            count++;
        }
        cout << 20 + count + 5;
    }
    return 0;
}

第二题:最小花费爬楼梯

牛客网做题链接:最小花费爬楼梯_牛客题霸_牛客网 (nowcoder.com)

这道题目是一个典型的动态规划问题。解决这类问题通常采用从后向前的思考方式。考虑到每次可以选择跳一级或者两级台阶,因此到达最后一个台阶的最小花费,取决于从倒数第二个台阶或倒数第三个台阶到达所需的最小花费。我们只需要计算这两种情况下的最小值,就可以得到到达最后一个台阶的总花费。按照这种逻辑,从后向前推算,每一级台阶的最小花费都可以通过这种方式得出。我们可以使用一个cost数组来存储到达每一级台阶的花费,同时使用一个dp数组来记录到达每一级台阶的最小总花费。

#include <iostream>
using namespace std;

const int N = 1e5 + 10;

int n;
int cost[N];
int dp[N];

int main()
{
    cin >> n;
    for(int i = 0;i < n;i++)
    {
        cin >> cost[i];
    }
    for(int i = 2; i <= n; i++) 
    {
        dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
    }
    cout << dp[n] << endl;
    return 0;
}

第三题:数组中两个字符串的最小距离

牛客网做题链接:数组中两个字符串的最小距离__牛客网 (nowcoder.com)

  1. 初始化变量

    • pre1 和 pre2 初始化为 -1,表示尚未找到字符串1和字符串2。

    • ret 初始化为一个非常大的数,用于记录两个字符串之间的最小距离。

  2. 遍历数组

    • 在一次遍历中,检查当前元素是否为字符串1或字符串2。

    • 如果找到字符串1:

      • 如果 pre2 已经指向字符串2,计算当前 pre1 和 pre2 之间的距离,并更新 ret 为最小值。

      • 更新 pre1 为当前索引。

    • 如果找到字符串2:

      • 如果 pre1 已经指向字符串1,计算当前 pre1 和 pre2 之间的距离,并更新 ret 为最小值。

      • 更新 pre2 为当前索引。

  3. 算法的正确性

    • 当 pre1 首次找到字符串1后,继续遍历直到 pre2 找到字符串2,此时计算的距离是最小的,因为后续的字符串2距离 pre1 都会更远。

    • 如果在 pre1 和 pre2 之间还有更优的字符串1位置,那么在 pre2 找到字符串2之后,继续遍历会找到这个更优的位置,并更新最小距离。

这个贪心算法之所以有效,是因为它在每次找到字符串1或字符串2时,都会尝试计算并更新最小距离,而不是等到遍历结束后再计算。这种方法确保了每次更新都是基于当前找到的最优解,从而避免了不必要的重复计算,降低了时间复杂度。

#include <iostream>
#include <string>
#include <climits> // 用于 INT_MAX 
using namespace std;

int main() {
    int n;
    string str1, str2;
    string strs;
    cin >> n;
    cin >> str1 >> str2;
    int prev1 = -1, prev2 = -1, ret = INT_MAX ;//0x3f3f3f3f
    for (int i = 0; i < n; i++)
    {
        cin >> strs;
        if (strs == str1)
        { 
        	// 去前⾯找最近的 str2
            if (prev2 != -1)
            {
                ret = min(ret, i - prev2);
            }
            prev1 = i;
        } 
        else if (strs == str2)
        { 
        	// 去前⾯找 str1
            if (prev1 != -1)
            {
                ret = min(ret, i - prev1);
            }
            prev2 = i;
        }
    }
    if(ret == INT_MAX ) //说明str1和str2其中一个或两个不存在或为NUlL //0x3f3f3f3f
        cout << -1 << endl;
    else 
        cout << ret << endl;
    return 0;
}

补充0x3f3f3f3f

        有时候使用的 0x3f3f3f3f 是一个在编程中常见的技巧,尤其是在竞赛编程和算法实现中。这个值是一个十六进制数,转换为十进制后大约是 1061109567,这个值比 int 类型(通常是32位)能表示的最大值(INT_MAX,通常为 2147483647)要小,但足够大,可以用作一个初始的“无穷大”值,在后续的比较中被实际的最小值替换。

使用 0x3f3f3f3f 而不是 INT_MAX 的原因主要有两个:
1.避免溢出:

在某些情况下,如果你试图将 INT_MAX 与另一个正数相加,结果可能会溢出并变成负数,这可能会破坏你的算法逻辑。而 0x3f3f3f3f足够小,以至于与任何合理的正数相加都不太可能溢出。

2.历史和习惯:

在某些编程社区和竞赛中,使用 0x3f3f3f3f 作为一种习惯或传统。这可能是因为早期的程序员发现这个值在特定情况下很有用,并且这个习惯被后来的程序员所采纳。

然而,在大多数情况下,直接使用 INT_MAX(或 std::numeric_limits::max(),如果你想要更明确的类型依赖)是更安全、更清晰的选择。这是因为 INT_MAX 是标准库定义的,具有明确的含义,并且与整数类型的最大值直接相关。


 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9/24作业

1. 分文件编译 分什么要分文件编译&#xff1f; 防止主文件过大&#xff0c;不好修改&#xff0c;简化编译流程 1) 分那些文件 头文件&#xff1a;所有需要提前导入的库文件&#xff0c;函数声明 功能函数&#xff1a;所有功能函数的定义 主函数&#xff1a;main函数&…

springboot实战学习(8)(登录接口中使用“JWT令牌“完成登录认证)(拦截器的创建与注册)

接着上篇博客学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上。也提到了"JWT令牌"的组成与使用。具体往回看了解的链接如下。springboot实战学习&#xff08;7&#xff09;(JWT令牌的…

TCP网络编程概述、相关函数、及实现超详解

文章目录 TCP网络编程概述1. TCP协议的特点2. TCP与UDP的差异3. TCP编程流程 TCP网络编程相关函数详解1. socket()&#xff1a;创建套接字参数说明&#xff1a;返回值&#xff1a;示例&#xff1a; 2. connect()&#xff1a;客户端连接服务器参数说明&#xff1a;返回值&#x…

【CubeMX学习笔记】关于CAN通信协议

目录 一、CAN通信简介 二、CAN数据帧类型 三、格式帧 四、位同步 传输数据时可能遇到的问题 最小时间单位 硬同步 再同步 波特率的计算 STM32中的CAN外设 一、原理图 二、标识符筛选 三、配置单个邮箱&#xff08;正常模式或自发自收只需要修改模式&#xff09; …

【动态规划-多重背包】【hard】力扣2585. 获得分数的方法数

考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types &#xff0c;其中 types[i] [counti, marksi] 表示第 i 种类型的题目有 counti 道&#xff0c;每道题目对应 marksi 分。 返回你在考试中恰好得到 target 分的方法数。由于答案可能很…

基于yolov5滑块识别破解(二)

通过上一篇文章基于yolov5滑块识别破解&#xff08;一&#xff09;-CSDN博客&#xff0c;我们已经完成了yolov5的部署和训练&#xff0c;接下来我们将对源码进行改动&#xff0c;来实现滑块的自动滑动破解。 1.获取坐标 修改detect中for循环的内容&#xff0c;获取目标的左上角…

SAP 利润分配-未分配利润的年初余额和年末余额不一致的问题

SAP OB53 本年利润科目的年初余额和年末余额不一致的问题 关于OB53科目的问题 OB53维护的本年利润科目 现象&#xff1a;为何去年年末的本年利润金额和今年年初的本年利润金额不一致。 解释原因&#xff1a; 本年利润科目的这种现象归根结底是“表结法”产生的&#xff0c;换…

如何在Mac上查看剪贴板历史记录

重点摘要 macOS 内建的剪贴簿查看器可以透过 Finder 存取,但只能显示最近一次复制的内容,而且重新开机后就会清除。若要更进阶的剪贴簿管理,第三方 app 像是 CleanClip 提供了强大的功能和更好的组织方式。CleanClip 提供了全方位的剪贴簿历史管理解决方案,支援各种内容类型和…

开源 AI 智能名片与 S2B2C 商城小程序:嫁接权威实现信任与增长

摘要&#xff1a;本文探讨了嫁接权威在产品营销中的重要性&#xff0c;并结合开源 AI 智能名片与 S2B2C 商城小程序&#xff0c;阐述了如何通过与权威关联来建立客户信任&#xff0c;提升产品竞争力。强调了在当今商业环境中&#xff0c;巧妙运用嫁接权威的方法&#xff0c;能够…

栈的深度解析:链式队列的实现

引言 队列是一种广泛应用于计算机科学的数据结构&#xff0c;具有先进先出&#xff08;FIFO&#xff09;的特性。在许多实际应用中&#xff0c;例如任务调度、缓冲区管理等&#xff0c;队列扮演着重要角色。本文将详细介绍队列的基本概念&#xff0c;并通过链表实现一个简单的…

进程间通信 (一)【管道通信(上)】

目录 1. 概况2. 管道通信的原理2.1 初步理解2.2 深入理解 1. 概况 是什么&#xff1a;两个及以上的进程实现数据层面的交互&#xff0c;称为进程间的通信。 因为进程独立性的存在&#xff0c;所以一个进程无法直接访问另一个进程的数据&#xff0c;即便是父子进程&#xff0c;子…

前端接口415状态码【解决】

前端接口415状态码【解决】 一、概述 415状态码是HTTP协议中的一个标准响应状态码&#xff0c;代表“Unsupported Media Type”&#xff08;不支持的媒体类型&#xff09;。当客户端尝试上传或发送一个服务器无法处理的媒体类型时&#xff0c;服务器会返回这个状态码。这通常意…

深度学习:常见损失函数简介--名称、作用和用法

目录 1. L1 Loss 2. NLL Loss (Negative Log Likelihood Loss) 3. NLLLoss2d 4. Gaussian NLL Loss 5. MSE Loss (Mean Squared Error Loss) 6. BCE Loss (Binary Cross-Entropy Loss) 7. Smooth L1 Loss 8. Cross Entropy Loss 1. L1 Loss 作用&#xff1a;计算预测值…

Arm Cortex-R52+ Generic Timer分析

目录 1.Generic Timer初识 2.R52的Generic Timer 3.如何配置Timer中断 4.小结 1.Generic Timer初识 Arm Cortex-R52内部实现了Generic Timer(通用计时器)&#xff0c;它可以基于递增计数来产生中断和事件流。 事实上&#xff0c;该计时器和Armv8-R AArch32中的定义完全一…

纯生信分析如何冲Microbiome

瘤胃微生物组对于反刍动物的消化过程至关重要&#xff0c;它能够将难以消化的饲料转化为高质量的蛋白质&#xff0c;但这一过程会产生甲烷&#xff0c;加速了气候暖化进程&#xff0c;还造成了饲料中营养和能量的损失。以往的研究主要集中在瘤胃细菌与反刍动物生产特性之间的关…

PHP探索校园新生态校园帮小程序系统小程序源码

探索校园新生态 —— 校园帮小程序系统&#xff0c;让生活更精彩&#xff01; &#x1f331;【开篇&#xff1a;走进未来校园&#xff0c;遇见新生态】&#x1f331; 你是否厌倦了传统校园的繁琐与单调&#xff1f;是否渴望在校园里也能享受到便捷、智能的生活体验&#xff1…

python爬虫:从12306网站获取火车站信息

代码逻辑 初始化 (init 方法)&#xff1a; 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法)&#xff1a; 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法)&#xff1a; 从服务器响应中提取车站信息字符串。去掉字符串末尾的…

spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。

1、有一个老项目&#xff0c;用到了网易云信&#xff0c;然后这里面有一个AppKey&#xff0c;然后调用的时候要在header中加入这些标识&#xff0c;进行与服务器进行交互。 2、开发将其存在了redis中&#xff0c;一开始的时候&#xff0c;我们测试用的老的key&#xff0c;然后提…

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要&#xff0c;而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理&#xff0c;以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP&#xff0c;全称超文本传输协议&#xf…

Spring Boot 点餐系统:您的移动餐饮伙伴

第二章关键技术的研究 2.1相关技术 网上点餐系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…