【刷题汇总--牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离】

C++日常刷题积累

  • 今日刷题汇总 - day002
    • 1、牛牛的快递
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现
      • 1.4、程序实现(扩展)
    • 2、最小花费爬楼梯
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现
    • 3、数组中两个字符串的最小距离
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现
      • 3.4、补充0x3f3f3f3f
    • 4、题目链接

今日刷题汇总 - day002

1、牛牛的快递

1.1、题目

描述
牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算。如果加急的话要额外付五元,请问牛牛总共要支付多少快递费
输入描述:
第一行输入一个单精度浮点数 a 和一个字符 b ,a 表示牛牛要寄的快递的重量,b表示牛牛是否选择加急,‘y’ 表示加急 ,‘n’ 表示不加急。
输出描述:
输出牛牛总共要支付的快递费用
示例1
输入:
1.5 y
输出:
26

1.2、思路

首先,读完题知道,这类题就是要理解题意,实现模拟场景的应用。了解到规则,需要处理快递的重量和是否加急的关系。通过分析,不难得出,以下四种情况:
(1)、快递不加急且小于20kg;
(2)、快递加急且小于20kg;
(3)、快递不加急且大于20kg;
(4)、快递加急且大于20kg;
其中关键在于,快递重量大于20kg时,1元/kg,且不足1kg仍然是1元计算。接下来就是程序实现。

1.3、程序实现

根据题目要求,定义重量a和是否加急b两个变量,并完成输入。注意变量的类型即可。

#include <iostream>
using namespace std;

int main()
{
    float a = 0;
    char b = 0;
    cin >> a >> b;
    return 0;
}

接着根据思路中分析出的四种情况编写判断程序,并且定义一个count表示一元钱。

#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')
    {
       
    }
    else if(a>=1 && b == 'y')
    {
       
    }
    return 0;
}

最后,处理快递重量大于20kg时,1元/kg,且不足1kg仍然是1元计算。那么思考得出,既然此时处于情况3和情况4,那么a肯定大于20kg,然后,我们就作减减运算,直到小于0,因为不足1也算一元计算。最后,根据起步价和是否加急,输出总结即可。

#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;
}

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

1.4、程序实现(扩展)

补充一个更优化的方法:ceil函数,用于向上取整,floor函数向下取整

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    double a;
    char b;
    cin >> a >> b;
    int ret = 0;
    if (a <= 1)
    {
        ret += 20;
    }
    else
    {
        ret += 20;
        a -= 1;
        /*
        double c = a - 1;
        if(c-(int)c > 0)
        	ret += (int)c + 1;
        else
        	ret += (int)c;
        */
        //等价
        ret += ceil(a);
    }
    if (b == 'y') ret += 5;
    cout << ret << endl;
    return 0;
}

2、最小花费爬楼梯

2.1、题目

这里是引用

2.2、思路

首先,读完题,发现是典型的动态规划题型。那么动态规划就会涉及状态表示和状态转移方程。再次分析题目需要理解,cost[i]表示在第i个台阶向上爬,才支付费用,意味着由之前的cost[i-1]或cost[i-2]跳到cost[i]位置时,不需要支付cost[i]的费用,而是支付cost[i-1]或cost[i-2]的费用。,此外,我们可以根据示例分析得出,楼梯顶部是所有台阶的下一个位置,即cost[n].(注意:cost[n-1]是数组的最后一个元素,因为下标从0开始)。明白了题意,接着分析,状态表示和状态转移方程。
状态表示:定义一个dp[i]数组,用来表示到达i位置的最小花费;这里是到达楼顶那么i 就等于n即可。
继续理解,dp[i] 为到达i位置的最小花费,那么刚才理解题目,仅仅到达是不用支付费用的,说明dp[i]的实际费用是cost[i-1]或cost[i-2]位置支付的最小费用,依次类推,cost[i-1]位置的最小费用dp[i-1]的费用来自于cost[i-1-1]或cost[i-1-2]支付的费用,那么推理得出状态转移方程。
状态转移方程:dp[i] = min(dp[i-1] + cost[i-1],dp[i-2],cost[i-2]);为最小费用。
值得注意的是理解了最终的收费dp[n],那么第一个和第二个台阶的收费就是dp[0] = 0;dp[1] = 0;
也就是说dp[2] = min(cost[0],cost[1]),直接从第三个台阶计算收费即可。
所以接下来,就是程序实现。

2.3、程序实现

首先,按照题目要求,定义变量n,表示数组长度;再定义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];
    }
    return 0;
}

接着,完善状态转移方程即可,直接从第三个台阶计费for(int i = 2; i <= n; i++) ,最后输出dp[n]就是到达楼顶的最小费用。

#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;
}

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

3、数组中两个字符串的最小距离

3.1、题目

在这里插入图片描述

3.2、思路

首先,读完题得知,要求一个字符串数组strs其中两个字符串str1和str2下标之间的最小距离。然后,得考虑以下几种情况:
(1)、strs中不存在str1或不存在str2时,输出-1;
(2)、strs中存在str1和str2且str1或str2为空时,输出-1;
(3)、strs中可能存在多个str1和str2,求其中最小的距离。
那么关键就在于怎么处理下标之间的关系。
采用蛮力法就是两层for循环遍历加一个判断,找匹配得下标位置,更新一个中间变量ret存放最小距离即可。但是此时时间复杂度为O(n^2),超出题目限制了。
那么思考可想到除了利用一个中间变量ret,不断记录和更新最小距离,此外,还需要利用两个变量prev1和prev2记录str1和str2的下标,辅助ret的更新。遍历strs,找到其中一个str1或str2时,再更新str1或str2之前是否有str2或str1,有则更新ret,否则更新当前下标prev1或prev2继续遍历,直到遍历结束得到的ret就是最小距离,接下来,就是程序实现。

3.3、程序实现

按照题目要求,编写输入项。注意按照题目要求的逐行输入。第一行输入n,代表strs长度,第二行输入要找的str1和str2,
第三行输入strs对应的n个字符串元素。

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

int main() {
    int n;
    string str1, str2;
    string strs;
    cin >> n;
    cin >> str1 >> str2;
    for (int i = 0; i < n; i++)
    {
        cin >> strs;
    }
    return 0;
}

接下来,我们需要对输入strs中的数组字符串元素进行处理,先定义变量prev1和prev2表示str1下标的位置和str2下标的位置;再进行思路分析出来的情况进行判断。相当于遍历strs,从输入的第一个字符串开始判断,如果strs[0] 等于 str1则更新并纪律str1下标的位置prev1,,同理,如果等于str2,则更新记录str2的下标位置prev2。值得注意的是这里直接可以用C++运算符重载” == “完成字符串的比较,对于C语言得用strcmp.

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

int main() {
    int n;
    string str1, str2;
    string strs;
    cin >> n;
    cin >> str1 >> str2;
    int prev1 = -1, prev2 = -1;
    for (int i = 0; i < n; i++)
    {
        cin >> strs;
        if (strs == str1)
        { 
         	prev1 = i;
        } 
        else if (strs == str2)
        { 
        	prev2 = i;
        }
    }
    return 0;
}

接着,对关键的下标之间的关系,进行处理。思考后这里需要利用一个中间变量ret,不断记录和更新存放最小距离。最好初始化一个不容易相等的数,比如INT_MAX或0x3f3f3f3f,然后,根据prev1和prev2的下标关系,建立最小关系。也就是说,当进入strs==str1时,找最近的prev2的下标位置,与当前位置即strs等于str1的下标位置,即prev1的位置,相减(i - prev2)即可。当strs 等于str2时,同理。

#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;
}

在这里插入图片描述

3.4、补充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 是标准库定义的,具有明确的含义,并且与整数类型的最大值直接相关。

4、题目链接

牛牛的快递
最小花费爬楼梯
数组中两个字符串的最小距离

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

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

相关文章

解码未来城市:探秘数字孪生的奥秘

在科技日新月异的今天&#xff0c;"数字孪生"&#xff08;Digital Twin&#xff09;这一概念如同一颗璀璨的新星&#xff0c;照亮了智慧城市、智能制造等多个领域的前行之路。本文将深入浅出地解析数字孪生的定义、技术原理、应用场景及未来发展&#xff0c;带您一窥…

亚马逊TM商标跟卖,同行截流采集,人工手动跟卖选品更方便!

区分TM标&#xff0c;软件自动查询&#xff0c;人工手动查询方便。 大家好&#xff0c;跟大家说下如何区分TM标。 选择相对于的站点&#xff0c;选择TM。 软件采集出来的已备案、未备案TMR标&#xff0c;现在点击TM标就会跳到美国商标局。 可以清晰的看到这个地方只有一个序…

电力授时设备常用:低功耗定位授时模块ATGM332D-5T

ATGM332D有5N微星定位模块系列和5T授时模块&#xff0c;其中我们今天要解读的是一款拥有高性能、低功耗、低成本优势且适用于各类授时设备并支持BDS/GNSS的定位授时模块ATGM332D-5T。 该系列模块产品是基于中科微第四代低功耗GNSS SOC单芯片—AT6558&#xff0c;支持多种微星导…

【实战】EasyExcel实现百万级数据导入导出

文章目录 前言技术积累实战演示实现思路模拟代码测试结果 前言 最近接到一个百万级excel数据导入导出的需求&#xff0c;大概就是我们在进行公众号API群发的时候&#xff0c;需要支持500w以上的openid进行群发&#xff0c;并且可以提供发送openid数据的导出功能。可能有的同学…

《昇思25天学习打卡营第1天|基本介绍》

文章目录 前言&#xff1a;今日所学&#xff1a;昇思MindSpore相关链接&#xff1a; 前言&#xff1a; 今天非常荣幸的收到了昇思25天学习打卡营的邀请。昇思MindSpore作为华为昇腾AI全栈的重要一员&#xff0c;他支持端、边、云独立的和协同的统一训练和推理框架&#xff0c;…

电脑录歌用什么软件好?分享电脑录音软件:6款

短视频普遍的今天&#xff0c;越来越多的人喜欢通过电脑进行音乐创作和录制。然而&#xff0c;面对市面上琳琅满目的电脑录音软件&#xff0c;很多人可能会感到困惑&#xff1a;电脑录歌用什么软件好呢&#xff1f;本文将为大家分享六款精选的录音软件&#xff0c;帮助大家找到…

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码&#xff08;复制即用&#xff09; 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

git提交实战

以新项目为例&#xff0c;如何在新项目新分支提交代码。 1.查看文件所在位置 git init 2.克隆项目到本地并完成身份配置 3.将需要新增的文件放到指定目录路径下 4.进入新克隆的文件 cd XXX 5.切换分支 git checkout XXX 6.标红者即为新提交的文件 git status 7.加入 git …

AI图生视频工具测试

环境&#xff1a; 即梦 pika LUMA 可灵 问题描述&#xff1a; AI图生视频工具测试下面是原图 解决方案&#xff1a; 1.即梦 效果 2.pika 生成效果 3.LUMA 生成效果还行 4.可灵 生成效果最好

AI模特换装试衣软件定制服务公司

&#x1f31f; 最强AI模特换装试衣模型训练、定制服务公司出炉 —— 触站AI&#x1f680; &#x1f3a8; 在AI技术的浪潮中&#xff0c;触站AI以其专业和创新&#xff0c;成为企业AI图像领域的技术解决方案服务公司&#xff0c;为设计界带来了革命性的变化。 &#x1f6e0;️ …

Hadoop3:Yarn的Tool接口案例

一、需求 依然以wordcount案例为基础&#xff0c;进行开发 我们知道&#xff0c;用hadoop自带的example.jar执行wordcount 命令如下 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename…

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项&#xff0c;便于之后的考研复习使用。 首先&#xff0c;对于普通的二阶和三阶行列式&#xff0c;我们可以直接对其进行拆开&#xff0c;展开。 而对于n阶行列式 其行列式的值等于它的任意…

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢&#xff1f;我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继…

昇思25天学习打卡营第9天|FCN图像语义分割

FCN是Fully Convolutional Networks的简称&#xff0c;即全卷积网络。区别于全连接网络&#xff0c;全连接网络每层直接cell全部连接&#xff0c;全卷积网络即每层都进行卷积。全卷积网络不包含全连接层。 卷积说有点像缩放&#xff0c;具体的可以参考其他专门的介绍文章。 之…

WPF UI 3D 多轴 机械臂 stl 模型UI交互

鼠标交互&#xff08;没有强调场景的变换&#xff09; 鼠标命中测试&#xff08;HitTest 不推荐&#xff09; 平面对象加载 数据绑定&#xff08;数据与动作&#xff09; 环境配置与相关方法 模型准备&#xff1a;Blender/SolidWorks 模型导入 HelixToolkit更多案例…

Profibus转Modbus网关在智能化水处理系统优化改造的应用

一、背景 在现代水处理行业中&#xff0c;智能化系统的应用已经成为提高效率和降低成本的关键。特别是在水厂中&#xff0c;罐内压载水处理系统的自动化和监控对于保障水质安全至关重要。而在这一过程中需要将水泵、阀门、传感器等设备连接到中控系统上。 二、方案 在控制器与…

SpringBoot + 虚拟线程,性能炸裂!

一、什么是虚拟线程 虚拟线程是Java19开始增加的一个特性&#xff0c;和Golang的携程类似&#xff0c;一个其它语言早就提供的、且如此实用且好用的功能&#xff0c;作为一个Java开发者&#xff0c;早就已经望眼欲穿了。 二、虚拟线程和普通线程的区别 “虚拟”线程&#xf…

C语言+ MSSQL技术开发的 PACS系统源码:CT后处理技术之仿真内镜CTVE

C语言 MSSQL技术开发的 PACS系统源码&#xff1a;CT后处理技术之仿真内镜CTVE 仿真内窥镜VE VE是利用医学影像作为原始数据&#xff0c;融合图像处理、计算机图形学、科学计算可视化、虚拟现实技术&#xff0c;模拟传统光学内镜的一种技术。 又叫做腔内重建技术&#xff0c;是…

海参海胆数据集:探索现实世界水下图像增强的创新之旅(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 在当今…

Nginx(http配置、https配置)访问Spring Boot 项目

前文 记录一下在linux服务器下配置nginx中nginx.conf文件代理访问springboot项目 1. spring boot.yml配置 其他mysql,redis,mybatis等之类的配置就不一一列出了 # 自定义配置 为了等下验证读取的配置文件环境 appName: productserver:port: 8083 # 应用服务 WEB 访问端口s…