题解:洛谷 AT_abc426_a OS Versions

【题目来源】

洛谷:AT_abc426_a [ABC426A] OS Versions - 洛谷

【题目描述】

某操作系统的版本按照时间顺序分别为“Ocelot”、“Serval”、“Lynx”。
判断版本 \(X\) 是否与版本 \(Y\) 相同或更新。

【输入】

输入由标准输入按以下格式给出:

\(X\) \(Y\)

【输出】

如果版本 \(X\) 与版本 \(Y\) 相同或比其更新,则输出 Yes;否则,输出 No

【输入样例】

Serval Ocelot

【输出样例】

Yes

【核心思想】

  1. 问题分析:给定三个按时间顺序排列的操作系统版本名"Ocelot"、"Serval"、"Lynx",需要判断版本 \(X\) 是否与版本 \(Y\) 相同或更新。这是一个字符串映射/直接比较问题,关键在于将版本名映射为时间顺序的数值,通过数值大小比较实现版本新旧判定。

  2. 算法选择

    • 哈希映射:用 map<string, int> 将版本名映射为时间序号(Ocelot=1, Serval=2, Lynx=3),实现 \(O(\log 3)\) 的字符串到数值转换
    • 数值比较:将版本新旧比较转化为整数大小比较
  3. 关键步骤

    • 建立映射mp["Ocelot"] = 1mp["Serval"] = 2mp["Lynx"] = 3
    • 读取输入:读入两个字符串 \(X\)\(Y\)
    • 比较判断:若 \(mp[X] \ge mp[Y]\) 输出 Yes,否则输出 No
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\)map 查找固定 \(3\) 个键,视为常数时间
    • 空间复杂度:\(O(1)\),仅存储 \(3\) 个键值对
  5. 字符串映射的核心思想

    • 语义到数值的转换:将无序的字符串标签转化为有序的数值,使比较操作标准化
    • 查表法:对于有限且固定的枚举值,预先建立映射表是最简洁高效的方案
    • 适用于"有限离散标签的比较/排序"类问题,核心是建立正确的映射关系

【算法标签】

入门 #字符串入门

【代码详解】

#include <bits/stdc++.h>
using namespace std;

// 声明一个全局map容器,用于存储字符串到整数的映射
map<string, int> mp;

int main()
{
    // 向map中插入键值对,表示不同动物名称对应的数值
    mp["Serval"] = 2;
    mp["Ocelot"] = 1;
    mp["Lynx"] = 3;

    // 声明两个字符串变量,用于接收输入
    string x, y;
    // 从标准输入读取两个字符串
    cin >> x >> y;

    // 比较两个字符串在map中对应的数值大小
    if (mp[x] >= mp[y])
    {
        // 如果x对应的数值大于等于y,输出"Yes"
        cout << "Yes" << endl;
    }
    else
    {
        // 否则输出"No"
        cout << "No" << endl;
    }

    return 0;
}

【运行结果】

Serval Ocelot
Yes
posted @ 2026-08-27 11:02  团爸讲算法  阅读(3)  评论(0)    收藏  举报