Skip to content

2025 - 题解

标签与难度

标签: 模拟, 字符串处理, 基础语法, 循环, 条件判断 难度: 800

题目大意喵~

各位算法大师,你们好呀,我是你们的小助手我,喵~ 今天我们遇到的这道题超级可爱,也超级直接哦!

题目是这样的: 我们一开始有一个数字,它的初始值是 1。然后,我们会得到一个由减号 '-' 和星号 '*' 组成的字符串。

我们需要从左到右一个一个地看这个字符串里的字符:

  • 如果遇到的是 '-',我们就把手里的数字减去 1。
  • 如果遇到的是 '*',我们就把手里的数字乘以 2。

当整个字符串都处理完之后,我们需要判断一下,我们手里的数字最终有没有大于或者等于 2025

  • 如果是的话,就骄傲地输出 YES
  • 如果不是的话,就输出 NO

是不是很简单明了呢?就像是跟着食谱做菜一样,一步一步来就好啦,喵~

解题思路分析

这道题的核心思想就是模拟(Simulation)!也就是说,题目怎么说,我们就怎么做,完全不需要什么花里胡哨的复杂算法,呐。

让我来带你一步一步拆解这个问题吧!

  1. 初始化: 题目告诉我们,初始数字是 1。所以,我们首先需要一个变量来存放这个数字,就叫它 sum 好了,然后让 sum = 1

  2. 读取输入: 我们需要把那个由 '-''*' 组成的字符串读进来。

  3. 遍历与计算: 这是最关键的一步!我们要从字符串的第一个字符开始,一直到最后一个字符,对每个字符进行判断和计算。

    • 我们可以用一个循环来做到这一点。
    • 在循环的每一步,我们取出当前位置的字符。
    • 然后用 if-else 语句来判断:
      • 如果这个字符是 '*',我们就执行 sum = sum * 2
      • 如果这个字符是 '-',我们就执行 sum = sum - 1

举个例子来加深理解,喵~ 假设输入的字符串是 s = "*-*"

  • 开始: sum 的初始值是 1
  • 第1个字符 '*': sum 变成了 1 * 2 = 2
  • 第2个字符 '-': sum 变成了 2 - 1 = 1
  • 第3个字符 '*': sum 变成了 1 * 2 = 2

字符串遍历结束!我们得到的最终 sum2

  1. 最终判断: 在循环结束,也就是整个字符串都处理完毕后,我们得到了一个最终的 sum 值。现在,我们只需要比较一下这个 sum2025 的大小关系。
    • 如果 sum >= 2025,就说明我们成功啦,输出 YES
    • 否则,就说明还差一点点,输出 NO

看吧,整个过程就像是小猫咪跟着毛线球滚动一样,思路非常直接。我们只需要把这个过程翻译成代码就大功告成啦!

代码实现

下面是我根据上面的思路,精心为你准备的一份C++代码。我用了 std::string 和范围 for 循环,这样代码看起来更整洁易懂哦,喵~

cpp
#include <iostream>
#include <string>
#include <vector>

// 主函数入口,喵~
int main() {
    // 为了让输入输出更快一点,这是一个小魔法哦!
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    // 定义一个字符串变量 s 来存储输入的指令
    std::string s;
    std::cin >> s;

    // 题目要求初始数字是 1,我们用一个 long long 类型的变量来存,防止数字变得太大
    // 虽然题目说字符串长度不超过20,int 也能存下,但用 long long 是个好习惯~
    long long sum = 1;

    // 使用范围for循环,依次遍历字符串 s 中的每一个字符 c
    // 这种写法很优雅,推荐给大家的说!
    for (char c : s) {
        if (c == '*') {
            // 如果是 '*',就将 sum 乘以 2
            sum *= 2;
        } else if (c == '-') {
            // 如果是 '-',就将 sum 减去 1
            sum -= 1;
        }
    }

    // 循环结束后,判断最终的 sum 是否大于等于 2025
    if (sum >= 2025) {
        std::cout << "YES" << std::endl;
    } else {
        std::cout << "NO" << std::endl;
    }

    // 程序顺利结束,返回0
    return 0;
}

复杂度分析

  • 时间复杂度: O(L)O(L) 这里的 LL 是输入字符串的长度。因为我们的代码只对字符串进行了一次从头到尾的遍历,所以花费的时间和字符串的长度是成正比的,记作 O(L)O(L)。对于这道题, L20L \le 20,所以速度快得像风一样,喵~

  • 空间复杂度: O(L)O(L) 我们主要需要空间来存储输入的字符串 s,其长度为 LL。除此之外,我们只用到了像 sum 这样的几个固定大小的变量,它们的空间是常数级别的,即 O(1)O(1)。所以总的空间复杂度主要取决于输入字符串的存储,为 O(L)O(L)

知识点总结

这道题虽然简单,但也是练习基本功的好机会呐!我们可以从中复习到:

  1. 模拟思想: 编程的核心能力之一就是将现实世界或题目描述的规则,一步步地用代码实现出来。
  2. 字符串处理: 学会如何读取和遍历一个字符串是基本操作。C++中的 std::string 和范围 for 循环 (for (char c : s)) 是非常现代和方便的工具。
  3. 条件分支: if-else 语句是控制程序流程的基石,用于根据不同的条件执行不同的代码块。
  4. 变量与数据类型: 选择合适的变量(如 long long)来存储计算过程中的数值,可以避免意想不到的溢出错误,这是一个好习惯哦!

希望这篇题解能帮到你!如果还有其他问题,随时可以来找我哦,喵~