算法1111

文章目录

    • [1. 牛牛的快递](#1. 牛牛的快递)
      • [1.1 思路](#1.1 思路)
      • [1.2 源码](#1.2 源码)
      • 1.3总结
    • [2. 最小花费爬楼梯](#2. 最小花费爬楼梯)
      • [2.1 思路](#2.1 思路)
      • [2.2 源码](#2.2 源码)
    • [3. 数组中两个字符串的最小距离](#3. 数组中两个字符串的最小距离)
      • [3.1 思路](#3.1 思路)
      • [3.2 源码](#3.2 源码)
        • [3.2.1 第一遍](#3.2.1 第一遍)
        • [3.2.2 第二遍](#3.2.2 第二遍)
      • [3.3 总结](#3.3 总结)

1. 牛牛的快递

牛牛的快递

1.1 思路

一道简单的模拟题

1.2 源码

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

int main() {
    float w;
    char ch;
    int ret = 0;

    cin >> w >> ch;

    if (w <= 1)
        ret += 20;
    else {
        ret += 20;
        w -= 1;
        ret += ceil(w);
    }

    if (ch == 'y')
        ret += 5;

    cout << ret << endl; 

    return 0;
}

1.3总结

  1. cout << ret << endl; 要加endl,刷新一下缓冲区,不加过不了。
  2. 用了ceil向上取整函数。

2. 最小花费爬楼梯

最小花费爬楼梯

2.1 思路

经典的动态规划

  1. 确定状态表示:dp[i] 表示到达i位置时的最小花费。
  2. 确定状态转移方程:min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
  3. 填表顺序:从左向右
  4. 初始化:dp[0] = 0, dp[1] = 0
  5. 返回dp[n]

2.2 源码

cpp 复制代码
#include<iostream>
#include<cstring>

/*
描述
给定一个整数数组 cost  ,其中 cost[i] 是从楼梯第i 个台阶向上爬需要支付的费用,下标从0开始。
一旦你支付此费用,即可选择向上爬一个或者两个台阶。
*/
using namespace std;
const int MAXN = 100000 + 1;
int cost[MAXN];
int dp[MAXN];

//手写分析过程:
//从大到小分析 对于第 i 阶,到顶需要的花费   dp[i] = cost[i] + min(dp[i + 1] , dp[i + 2])
//最后取 min(dp[0] , dp[1])
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> cost[i];
    }
    if (n == 1) {
        cout << cost[0] << endl;
        return 0;
    } else if (n == 2) {
        cout << min(cost[0], cost[1]);
        return 0;
    } else {
        memset(dp, 0, sizeof(dp));
        //dp初始化 对于最后一阶和倒数第二阶而言,他们需要的花费就是他们位置的cost
        dp[n - 1] = cost[n - 1];
        dp[n - 2] = cost[n - 2];
        //从单数第三个开始,花费 就是 cost[i] + min(dp[i + 1] , dp[i + 2])
        //跳一步 和 跳两步 两种情况取花费少的情况
        for (int i = n - 3; i >= 0; --i) {
            dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);
        }
        //最后从"从0开始"和"从1开始" 两者选小的那个
        //实际上,二者表达的是 从0 、1开始之后的能实现的最低花费已经计算出来了
        //选择只是为了选择 "从哪个开始更优"
        cout << min(dp[0], dp[1]) << endl;
    }

    return 0;
}

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

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

3.1 思路

  1. 暴力解法(双指针遍历数组)
  2. 优化暴力解法(一个指针,两个变量,一次循环遍历解决问题)
  3. 预处理的思想,不再用指针遍历,而是用变量存储。

3.2 源码

3.2.1 第一遍
cpp 复制代码
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <cstdlib>

int main() 
{
    int n = 0;
    cin >> n;
    vector<string> strs;
    for (int i = 0; i < n; i++) 
    {
        string str;
        cin >> str;
        strs[i] = str;
    }

    string str1, str2;
    cin >> str1 >> str2;

    int prev1, prev2;
    prev1 = prev2 = -1;
    int ret = 0;
    for (int i = 0; i < n; i++) 
    {
        if (strs[i] == str1) 
        {
            prev1 = i;
            if(strs[prev2] == str2)
                ret = prev1 - prev2;
        }
        else if (strs[i] == str2) 
        {
            prev2 = i;
            if(strs[prev1] == str1)
                ret = prev1 - prev2;
        }
    }
    cout << abs(ret) << endl;
    return 0;
}
3.2.2 第二遍
cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

int main() {
    int n;
    string s;
    string s1, s2;
    cin >> n;
    cin >> s1 >> s2;
    int prev1 = -1, prev2 = -1, ret = 0x3f3f3f3f;

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

    return 0;
}

3.3 总结

  1. 没有必要真的定义一个字符数组,字符数组的是很珍贵的,数组的意义让你能重复遍历,但是,咱们完全可以一次遍历结束。
  2. 注意"数组"不要越界。

相关推荐
PPPPPaPeR.9 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
看我干嘛!9 小时前
python第五次作业
算法
历程里程碑9 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun9 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon9 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
生锈的键盘9 小时前
推荐算法实践:交叉特征的理解
算法
乌萨奇也要立志学C++9 小时前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米9 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)10 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
_OP_CHEN10 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc