前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >48days强训——day2

48days强训——day2

作者头像
秋邱
发布2025-03-25 13:26:18
发布2025-03-25 13:26:18
3600
代码可运行
举报
文章被收录于专栏:笔记笔记
运行总次数:0
代码可运行

一题:牛牛的快递

链接:牛牛的快递_牛客题霸_牛客网

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

解题:

先判断快递重量a,若a<=1,基础费用为 20 元;若a>1,超出 1kg 部分向上取整,按每千克 1 元计算,再加上 20 元得到基础费用,接着根据字符 b 判断是否加。

代码:

代码语言:javascript
代码运行次数:0
运行
复制
#include <bits/stdc++.h>
using namespace std;

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

    if(a <= 1) sum += 20;
    else
    {
        sum += 20;
        a -= 1;
        //sum += ceil(a);利用库函数
        int c =(int)a;
        sum += c;
        if(a-c > 0.1)sum +=1;
    }
    if(b =='y') sum += 5;
    cout << sum << endl;
    return 0;
}

第二题:最⼩花费爬楼梯

链接:最小花费爬楼梯_牛客题霸_牛客网

描述 给定一个整数数组 cost cost ,其中 cost[i] cost[i] 是从楼梯第i i 个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 数据范围:数组长度满足 1≤n≤105 1≤n≤105 ,数组中的值满足 1≤costi≤104 1≤costi​≤104 输入描述: 第一行输入一个正整数 n ,表示数组 cost 的长度。 第二行输入 n 个正整数,表示数组 cost 的值。 输出描述: 输出最低花费 示例1 输入: 3 2 5 20 输出: 5 说明: 你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费为5 示例2 输入: 10 1 100 1 1 1 90 1 1 80 1 输出: 6 说明: 你将从下标为 0 的台阶开始。

  1. 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
  2. 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
  3. 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
  4. 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
  5. 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
  6. 支付 1 ,向上爬一个台阶,到达楼梯顶部。

总花费为 6 。

解题(动态规划): 这里的难点是,n(1开始)的下一个位置才是楼顶,而非n。

初始化:当i=0,1时,会出现边界问题,就需要先初始化,初始化为0。

最后返回n的位置。

代码语言:javascript
代码运行次数:0
运行
复制
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> nums(n);
    for(int i = 0;i < n; i++) cin >> nums[i];

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

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

链接:数组中两个字符串的最小距离__牛客网

描述 给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。 输入描述: 输入包含有多行,第一输入一个整数n(1≤n≤105)(1 \leq n \leq 10^5)(1≤n≤105),代表数组strs的长度,第二行有两个字符串分别代表str1和str2,接下来n行,每行一个字符串,代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。 输出描述: 输出一行,包含一个整数,代表返回的值。 示例1 输入 1 CD AB CD 输出 -1 示例2 输入 5 QWER 666 QWER 1234 qwe 666 QWER 输出 1 备注: 时间复杂度O(n),额外空间复杂度O(1)

解法(模拟+贪心)⭐ 这题可以采用暴力解法,但是会超时,那么就在暴力的基础上进行优化。

定义两个指针,prev1(存第一个目标字符的下标) ,prev2(存第二个字符的下标)。

当遇到其中一个,就向字符前找另外一个,以此算法可以达到o(n)。

代码语言:javascript
代码运行次数:0
运行
复制
#include <bits/stdc++.h>
using namespace std;

int main() 
{
    int t;
    cin >> t;
    string s,s1,s2;
    cin >> s1 >> s2;

    int prev1 = -1,prev2 = -1,ret = 0X3F3F3F3F;
    for (int i = 0; i <t; i++) 
    {
        cin >> s;
        if(s == s1)
        {
            prev1 = i;
            if(prev2 != -1) ret=min(ret,prev1-prev2);
        }
        else if (s == s2) 
        {
            prev2 = i;
            if(prev1 != -1) ret=min(ret,prev2-prev1);
        }
    }
    if(ret == 0X3F3F3F3F) cout << -1 << endl;
    else cout << ret << endl;
    return 0;
}

总结:

向上取整库函数:ceil(天花板)

向下取整库函数:floor(地板)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二题:最⼩花费爬楼梯
  • 第三题:数组中两个字符串的最小距离
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档