【笔试强训】Day2 --- 牛牛的快递 + 最小花费爬楼梯 + 数组中两个字符串的最小距离

文章目录

    • [1. 牛牛的快递](#1. 牛牛的快递)
    • [2. 最小花费爬楼梯](#2. 最小花费爬楼梯)
    • [3. 数组中两个字符串的最小距离](#3. 数组中两个字符串的最小距离)

1. 牛牛的快递

【链接】:牛牛的快递

解题思路:简单模拟题,主要是处理⼀下输⼊的问题。

cpp 复制代码
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a;
    char b;
    cin>>a>>b;

    int sum = 0;
    if(b == 'y') sum += 5;
    if(a <= 1)
    {
        sum += 20;
    }
    else 
    {
        sum += 20;
        // a -= 1;
        // sum += ceil(a); // 向上取整函数ceil
        double c = a - 1;
        if(c - (int)c > 0) sum += (int)c + 1;
        else sum += (int)c;
    }
    cout<<sum<<endl;
    return 0;
}

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

// int main() {
//     double a;
//     char b;
//     cin>>a>>b;
//     int sum = 0;
//     if(b == 'y') sum += 5;
//     sum += 20;
//     a -= 1;
//     while(a > 0)
//     {
//         a--;
//         sum++;
//     }
//     cout<<sum<<endl;
//     return 0;
// }

2. 最小花费爬楼梯

【链接】:最小花费爬楼梯

解题思路:动态规划,简单线性 dp。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

const int N = 1e5 + 10;

int cost[N];
int dp[N]; // dp[i]表示:爬到下标为i的台阶需要的最小费用

int main() {
    int n;
    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. 数组中两个字符串的最小距离

【链接】:数组中两个字符串的最小距离

解题思路 :模拟 + 贪心:

◦ ⽤ prev1 标记 i 位置之前最近⼀次出现的第⼀个字符串的下标;

◦ ⽤ prev2 标记 i 位置之前最近⼀次出现的第⼆个字符串的下标。

cpp 复制代码
#include <iostream>
#include <string>
#include <climits>
using namespace std;

int main()
{
    int n;
    string s1, s2, s;

    cin>>n;
    cin>>s1>>s2;

    int prev1 = -1,prev2 = -1,ret = 0x3f3f3f3f;
    for(int i = 0;i < n;i++){
        cin >> s;
        if(s == s1) // 去找前面最近的s2
        {
            if(prev2 != -1)
                ret = min(ret, i - prev2);
            prev1 = i;
        }
        else if(s == s2) // 去找前面最近的s1
        {
            if(prev1 != -1)
                ret = min(ret, i - prev1);
            prev2 = i;
        }
    }
    //if(ret == 0x3f3f3f3f) cout<<-1<<endl;
    if(prev1 == -1 || prev2 == -1) cout<<-1<<endl;
    else cout<<ret<<endl;
    return 0;
}

相关推荐
wangjialelele5 分钟前
Linux下的IO操作以及ext系列文件系统
linux·运维·服务器·c语言·c++·个人开发
打工哪有不疯的17 分钟前
使用 MSYS2 为 Qt (MinGW 32/64位) 完美配置 OpenSSL
c++·qt
代码游侠31 分钟前
C语言核心概念复习——C语言基础阶段
linux·开发语言·c++·学习
㓗冽39 分钟前
60题之内难题分析
开发语言·c++·算法
rainbow68891 小时前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
John_ToDebug1 小时前
Chromium安全架构深度解析:从悬空指针检测到内存安全防御体系
c++·chrome
D_evil__1 小时前
【Effective Modern C++】第五章 右值引用、移动语义和完美转发:24. 区分万能引用和右值引用
c++
蜡笔小马1 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
我是咸鱼不闲呀1 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
林开落L2 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制