题解:洛谷 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
【核心思想】
-
问题分析:给定三个按时间顺序排列的操作系统版本名"Ocelot"、"Serval"、"Lynx",需要判断版本 \(X\) 是否与版本 \(Y\) 相同或更新。这是一个字符串映射/直接比较问题,关键在于将版本名映射为时间顺序的数值,通过数值大小比较实现版本新旧判定。
-
算法选择:
- 哈希映射:用
map<string, int>将版本名映射为时间序号(Ocelot=1, Serval=2, Lynx=3),实现 \(O(\log 3)\) 的字符串到数值转换 - 数值比较:将版本新旧比较转化为整数大小比较
- 哈希映射:用
-
关键步骤:
- 建立映射:
mp["Ocelot"] = 1,mp["Serval"] = 2,mp["Lynx"] = 3 - 读取输入:读入两个字符串 \(X\) 和 \(Y\)
- 比较判断:若 \(mp[X] \ge mp[Y]\) 输出
Yes,否则输出No
- 建立映射:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),
map查找固定 \(3\) 个键,视为常数时间 - 空间复杂度:\(O(1)\),仅存储 \(3\) 个键值对
- 时间复杂度:\(O(1)\),
-
字符串映射的核心思想:
- 语义到数值的转换:将无序的字符串标签转化为有序的数值,使比较操作标准化
- 查表法:对于有限且固定的枚举值,预先建立映射表是最简洁高效的方案
- 适用于"有限离散标签的比较/排序"类问题,核心是建立正确的映射关系
【算法标签】
入门 #字符串入门
【代码详解】
#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
浙公网安备 33010602011771号