【笔试强训】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;
}

相关推荐
GG-_-Bond34 分钟前
9.1 kv存储resp协议模拟面试
c++
米糕闯编程1 小时前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
xiangyun612 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun612 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
fpcc4 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__4 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic1014 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu5 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
bnmoel5 小时前
C++ 基础入门篇(三):内联函数与空指针
c++·内联函数·nullptr·低层
码匠许师傅5 小时前
【C++三方组件】TinyXML2:两个文件的极简 XML 解析器
xml·c++