笔试练习day2

news2025/1/15 20:26:07

目录

  • BC64 牛牛的快递
    • 题目解析
    • 解法
      • 模拟
      • 代码
        • 方法1
        • 方法2
  • DP4 最小花费爬楼梯
    • 题目解析
    • 解法
      • 动态规划
        • 状态表示
        • 状态转移方程
        • 代码
  • 数组中两个字符串的最小距离
    • 题目解析
    • 解法
      • 方法1暴力解法(会超时)
      • 方法2贪心(动态规划)
      • 代码

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录
🏀🏀🏀 笔试练习题

BC64 牛牛的快递

链接BC64 牛牛的快递
在这里插入图片描述

题目解析

这道题和出租车那种是一个意思,首先要有一个起步价格,之后多出来的要额外收费,这样看起来就是一个一次函数的方程,y=kx+b+a,k=1是每千克收的钱,x是快递的重量(这里要注意x有小数的话要往整数进1),b=20表示的是起步价,而a就是是否加急的费用,不加急a=0,加急a=5

解法

模拟

我们需要先模拟一下这个过程,假设有akg,对于a来说有两种情况,一种是<=1,另一种是>1
在这里插入图片描述
对于<=1这种情况比较简单,>1这种情况是要考虑a-1是否有小数,如果有小数就需要向上取整,比如1.1向上取整就是2
这里的向上取整有两种方法
第一种就是先判断(a-1)-(int)(a-1)是否大于0,如果大于0就再加1
第二种就是用一个函数ceil(a-1),这个函数可以自动向上取整(需要包含头文件cmath)
在这里插入图片描述
最后再判断要不要加急

代码

方法1
#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;
      double c=a-1;
      if(c-(int)c>0)
      ret+=int(c)+1;
      else
       ret+=c;
    }
    if (b == 'y')
        ret += 5;
    cout << ret << endl;
    return 0;
}
方法2
#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;
        ret += ceil(a);
    }
    if (b == 'y')
        ret += 5;
    cout << ret << endl;
    return 0;
}

DP4 最小花费爬楼梯

链接DP4 最小花费爬楼梯
在这里插入图片描述

题目解析

为了方便我们将第一个例子用图来表示,假设小人从第-1个台阶开始走(事实上没有第-1个台阶),此时在第-1个台阶开始他只需要支付0元就可以选择爬1个或2个台阶
在这里插入图片描述
这里需要注意的一点就是楼顶我们需要判断在哪
根据第一个例子第0层花2元,第一层花5元
如果楼顶在第二层的话,花费最少的方式就是选择第0层开始爬,这样我们就只需花2元就到达第2层(这里是将第2层看作楼顶)
如果楼顶在第三层的话,花费最少的方式就是选择第1层开始爬,这样我们就只需话5元就到底第3层(这里是将第3层看作楼顶)
根据示例我们可以得出结果为5元,所以楼顶应该是在3楼

对于楼顶在第3层我们有如下的几种方式到达
第一种方式0->1->3
在这里插入图片描述
第二种方式0->2->3
在这里插入图片描述
第三种方式1->3
在这里插入图片描述

解法

动态规划

状态表示

我们可以将上面的台阶简化成下面的一个数组,第i个台阶就表示数组第i个元素,现在需要求到第i个元素的最小花费,我们用dp[i]表示
在这里插入图片描述

状态转移方程

状态转移方程我们一般从最后一步去划分情况
比如到达i位置时我们可以花费cost[i-1]从i-1位置跳到i位置
也可以划分cost[i-2]从i-2位置跳到i位置
在这里插入图片描述
而从i-2到i的总费用就是到达i-2时的最小花费加上cost[i-2],也就是dp[i-2]+cost[i-2]
从i-1到i的总费用就是到达i-1的最小花费加上cost[i-1],也就是dp[i-1]+cost[i-1]
dp[i]就是判断dp[i-1]+cost[i-1]和dp[i-2]+cost[i-2]谁花费的价钱最少
所以dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
从上面的方程可知dp[i]的值需要知道dp[i-1]和dp[i-2]的值,而dp[i-1]和dp[i-2]的值又需要知道他们前面的dp[i-3]…的值,所以我们需要从左向右开始推导
因为dp[2]需要知道dp[0]和dp[1]的值,但是dp[0]和dp[1]不能继续细分dp[-1]…,所以dp[0]和dp[1]我们需要初始化
根据题意我们是可以选择从0或1台阶开始起跳的,也就是说我们到达0台阶和到达1台阶是不需要花钱的
所以dp[0]=dp[1]=0,知道dp[0]和dp[1]后就可以往后推dp[n]了(注意这里的n是楼顶表示的是最后一块台阶的下一个位置)

代码
#include <iostream>
using namespace std;

int main() {
int cost[100000],dp[100000]={0};
int n=0;
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;
}

注意这里的min是一个自带的函数,当然也可以自己去实现

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

链接数组中两个字符串的最小距离
在这里插入图片描述

题目解析

这道题有点难读懂,我们以示例2为例子
strs是一个字符串数组,字符串数组的每一个元素都是字符串
str1和str2都是一个字符串,他们可能是在字符串数组里的,现在需要我们去在这个字符串数组中找出str1和str2,并且求出他们对应位置的最小值(因为strs里可能含义多个相同的字符串,所以要对他们的距离进行比较,得到最后的值),如果没有找到就返回-1
在这里插入图片描述
这个图中str1在strs中出现了两次,一个是在第0个位置,另一个是在第5的一个位置
str2只出现了一次,是在第4的一个位置
他们的距离是|0-4|和|4-5|,也就是4和1,显然最短的距离就是1,所以返回1
这道题也可以换成下面这样
在数组中求出a和b的最小距离
在这里插入图片描述
或者在下面字符串求出a和b的最小距离
在这里插入图片描述

解法

方法1暴力解法(会超时)

我们还是以示例2为例子
先用一层for循环用一个指针ptr1去找出QWER的位置
然后在这一层for循环里面再嵌套一次for循环用指针ptr2去找666
之后用一个ret去记录他们之间的距离
在这里插入图片描述
记录完后再让ptr2往后找是否有是否还有相同的字符串,因为有可能会出现下面这种情况,就是QWER会在第一次的666后面

在这里插入图片描述

在这里插入图片描述

内部for循环找完后,又回到外部for循环,再让ptr1往后找是否有QWER,找到后又进入内部for循环
这种解法的时间复杂度是O(n^2),会超时,所以这里只是提供一个思路

方法2贪心(动态规划)

这个方法是在方法1的基础上进行了优化
在这里插入图片描述
我们还是让ptr1和ptr2分别记录QWER和666的下标,并且因为是数组,所以我们让ptr1和ptr2记录的位置初始化成-1,表示他们还没有开始记录下标
在这里插入图片描述
然后我们先让ptr1去找QWER的位置
在这里插入图片描述
找到后向左查找最近的一次666出现的位置,如果没有出现那么ptr2就不会变,仍为-1
在这里插入图片描述
此时我们还需要注意ptr1记录的下标需要更新,这里的QWER下标为0,所以ptr1记录的值也应该变成0
在这里插入图片描述
然后再向右开始遍历,如果右边的QWER比666先出现,那么就先更新ptr1,如果666比QWER先出现,那么就先更新ptr2
在这里插入图片描述
这里的666先出现,所以就将ptr2记录的值变成3,然后ret比较一下他们现在的距离和之前的最短距离谁更短
因为之前没有666出现,所以ret是没有最短距离的,因此这里的ret直接就等于3
之后再向右遍历,因为右边只有一个QWER了,所以就让ptr1更新一下
在这里插入图片描述
这次的距离是最短的,所以ret更新为1
这个方法的时间复杂度为O(N),只用一次循环就找出了最短距离

代码

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

int main() {
    int n;
    string s1, s2;
    string s;
    cin >> n;
    cin >> s1 >> s2;
    int ptr1 = -1, ptr2 = -1, ret = 0x3f3f3f3f;
    for (int i = 0; i < n; i++) {
        cin >> s;
        if (s == s1) 
        {
            if (ptr2 != -1) 
            {
                ret = min(ret, i - ptr2);
            }
            ptr1 = i;
        }
        else if (s == s2) 
        {
            if (ptr1 != -1)
            {
                ret = min(ret, i - ptr1);

            }
            ptr2 = i;
        }
    }
    if (ret == 0x3f3f3f3f)
        cout << -1;
    else
        cout << ret;
    return 0;
}

这段代码中ret初始化为0x3f3f3f3f表示非常大的一个值,也就是这道题的距离不会有比这个值更大的

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

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

相关文章

【数据脱敏】数据交换平台数据脱敏建设方案

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

GD32 IAP升级——boot和app相互切换

GD32 IAP升级——boot和app相互切换 目录 GD32 IAP升级——boot和app相互切换1 Keil工程设置1.1 修改ROM1.2 Keil烧录配置 2 代码编写2.1 app跳转2.2 软件重启2.3 app中断向量表偏移 结束语 1 Keil工程设置 1.1 修改ROM GD32内部Flash是一整块连续的内存&#xff0c;但是因为…

数学计算之JS小数精度问题(java/python)

number 小数计算会出现精度不准确问题&#xff0c;js中number是64 位双精度浮点数。 其实&#xff0c;不仅仅只有javascript&#xff0c;还有java、python等都会有类似问题&#xff0c;因为计算机中存的都是二进制&#xff08;浮点数IEEE754是被普遍使用的标准&#xff09;&am…

Java:线程安全

引子 首先来看一段代码: private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{for (int i 0; i < 50000; i) {count;}});Thread t2 new Thread(()->{for (int i 0; i < 50000; i) {…

Java语言程序设计——篇十一(4)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

深入解析 KMZ 文件的处理与可视化:从数据提取到地图展示项目实战

文章目录 1. KMZ 文件与 KML 文件简介1.1 KMZ 文件1.2 KML 文件 2. Python 环境配置与依赖安装3. 代码实现详解3.1 查找 KMZ 文件3.2 解压 KMZ 文件3.3 解析 KML 文件3.4 可视化 KMZ 数据 4. 项目实战4.1. 数据采集4.2. 项目完整代码 5. 项目运行与结果展示6. 总结与展望 在处理…

2007-2023年上市公司国内外专利申请获得情况数据

2007-2023年上市公司国内外专利申请获得情况数据 1、时间&#xff1a;2007-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、统计截止日期、报表类型、地区、申请类型编码、申请类型、专利&#xff08;件&#xff09;、发明专利&#xff08;件&#x…

动态路由协议基础

一、动态路由协议简介 动态路由协议:路由器用来计算和维护路由信息的协议;通俗的说,就算路由器用来学习路由的协议。 二、动态路由与静态路由的区别 静态路由动态路由路由表手工配置自动生成路由维护人工维护自动收敛资源消耗路由表生成不占网络资源路哟表生成占用网络资源…

学习Java的日子 Day59 学生管理系统 web1.0版本

Day59 学生管理系统 web1.0 1.项目需求 有两个角色&#xff0c;老师和学生&#xff0c;相同的功能提取到父类用户角色 2.数据库搭建 设计学生表 设计老师表 插入数据 (超级管理员) 设计学科表 3.项目搭建 处理基础页面&#xff0c;分包&#xff0c;实体类&#xff0c;导入数据…

微软AI业务最新营收数据情况(2024年7月)

Azure AI 年度经常性收入 (ARR)&#xff1a;达到50亿美元客户数量&#xff1a;60,000家平均客户价值 (ACV) 中位数&#xff1a;83,000美元同比增长率&#xff1a;达到了惊人的900% GitHub Copilot 年度经常性收入 (ARR)&#xff1a;达到3亿美元客户数量&#xff1a;77,000家…

每日两题8

买卖股票的最佳时机 III class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();int INF 0x3f3f3f3f;vector<vector<int>> f(n, vector<int>(3, -INF));auto g f;g[0][0] 0;f[0][0] -prices[0];for (int i 1; i…

Leetcode3227. 字符串元音游戏

Every day a Leetcode 题目来源&#xff1a;3227. 字符串元音游戏 解法1&#xff1a;博弈论 分类讨论&#xff1a; 如果 s 不包含任何元音&#xff0c;小红输。如果 s 包含奇数个元音&#xff0c;小红可以直接把整个 s 移除&#xff0c;小红赢。如果 s 包含正偶数个元音&am…

10.Redis类型SortedSet

介绍 Redis的SortedSet是一个可排序的set集合。与java的TreeSet有些类似&#xff0c;但底层数据结构却差别很大。 SortedSet中的每个元素都带有一个score属性&#xff0c;可以基于score属性对元素排序&#xff0c;底层实现是一个跳表SkipList加hash表。 特点 可排序 元素不…

“银狐”团伙再度出击:利用易语言远控木马实施钓鱼攻击

PART ONE 概述 自2023年上半年“银狐”工具被披露以来&#xff0c;涌现了多个使用该工具的黑产团伙。这些团伙主要针对国内的金融、教育、医疗、高新技术等企事业单位&#xff0c;集中向管理、财务、销售等从业人员发起攻击&#xff0c;窃取目标资金和隐私信息。该团伙惯用微信…

多旋翼+四光吊舱:5Kg负载无人机技术详解

多旋翼无人机是一种具有三个及以上旋翼轴的无人驾驶飞行器。它通过每个轴上的电动机转动&#xff0c;带动旋翼&#xff0c;从而产生升推力。旋翼的总距固定&#xff0c;不像一般直升机那样可变。通过改变不同旋翼之间的相对转速&#xff0c;可以控制飞行器的运行轨迹。多旋翼无…

Js在线Eval加密混淆及解密运行

具体请前往&#xff1a;Js在线Eval加密混淆及解密运行

自动打电话软件的效果怎么样?

​​使用这个系统&#xff0c;机器人自动拨打电话&#xff0c;真人录制的语音与客户对话&#xff0c;整个过程非常顺畅。而且系统可以每天外呼数千乃至数万通电话&#xff0c;是人工的5-10倍&#xff0c;这样就不需要招聘大量员工来外呼&#xff0c;只需要留下一些优秀的销售人…

动视封禁超过6.5万名《战区》和《MW3》作弊者

动视已经在《使命召唤&#xff1a;战区》和《使命召唤&#xff1a;现代战争3》中封禁了超过65000名玩家。这些封禁在过去的几小时内实施&#xff0c;清除了数千名在排名赛和非排名赛中“作弊和代练”的玩家。 Ricochet反作弊团队现已清理了《使命召唤&#xff1a;战地》和《现代…

【PyTorch】神经风格迁移项目

神经风格迁移中&#xff0c;取一个内容图像和一个风格图像&#xff0c;综合内容图像的内容和风格图像的艺术风格生成新的图像。 目录 准备数据 处理数据 神经风格迁移模型 加载预训练模型 定义损失函数 定义优化器 运行模型 准备数据 创建data文件夹&#xff0c;放入…

人工智能与大数据的融合:驱动未来的力量

人工智能与大数据的融合&#xff1a;驱动未来的力量 一、人工智能与大数据的概述二、人工智能与大数据在数据库中的融合三、实际应用案例四、未来发展方向总结 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天&#xff0c;数据库作为IT技术领域的“活化石”&#xff…