1 条题解

  • 0
    @ 2026-6-19 10:30:55

    📝 题目大意

    给定一个长度为 3 的字符串 SS,由 R(米饭)、M(味噌汤)、S(沙拉)各一个字符组成,表示三盘菜从左到右的排列顺序。判断米饭 R 是否在味噌汤 M 的左侧。

    💡 解题思路

    1. 题目分析:字符串长度固定为 3,且 RMS 各出现恰好一次。问题本质是判断字符 R 的下标是否小于字符 M 的下标。

    2. 算法推导:根据 M 所在的位置分三种情况讨论(代码中数组下标从 1 开始):

      • M 在位置 1(最左侧)R 不可能在 M 左边,直接输出 No
      • M 在位置 2(中间):检查 R 在位置 1 还是位置 3。若 R 在位置 1 则输出 Yes,若 R 在位置 3 则输出 No
      • M 在位置 3(最右侧)R 一定在 M 左边,直接输出 Yes
    3. 边界与细节:字符串长度固定为 3 且无重复字符,没有特殊情况。注意标准代码中 char s[3] 却使用了 s[1]~s[3](1-indexed),存在数组越界,实际使用时应声明为 char s[4] 或直接使用 string

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅需常数次字符比较。
    • 空间复杂度O(1)O(1),仅需存储 3 个字符。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        char s[3];                  // 注意:实际建议声明为 char s[4],避免越界
        for(int i = 1; i <= 3; i++) // 1-indexed 读入,方便后续判断
            cin >> s[i];
        if(s[1] == 'M')             // M 在最左侧,R 不可能在 M 左边
            cout << "No";
        else if(s[2] == 'M'){       // M 在中间
            if(s[1] == 'R')         // R 在位置 1,位于 M 左侧
                cout << "Yes";
            if(s[3] == 'R')         // R 在位置 3,位于 M 右侧
                cout << "No";
        }
        else                        // M 在最右侧,R 一定在 M 左边
            cout << "Yes";
        return 0;
    }
    
    • 1

    信息

    ID
    820
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者