1 条题解

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

    📝 题目大意

    NN 盘菜按顺序吃,每盘要么是甜的(sweet)要么是咸的(salty)。如果连续吃到两盘甜菜,高桥君就会停止吃后续的菜。判断他能否吃完所有 NN 盘菜。

    💡 解题思路

    1. 题目分析N100N \leq 100,数据量极小,直接模拟即可。关键在于理解"连续两盘甜菜就停止"的边界条件——如果最后两盘恰好都是甜菜,此时已经吃完所有菜,自然算作成功。

    2. 算法推导

      • prev 记录上一盘菜的口味,初始为空串。
      • stop 标记是否已经触发了停止条件。
      • 遍历每一盘菜 sis_i0i<N0 \leq i < N),当 prev == "sweet"s == "sweet" 时,说明出现了连续两盘甜菜。此时需要判断当前位置 ii 是否是最后一盘菜(i=N1i = N-1):
        • iN1i \neq N-1,即这对连续甜菜不是末尾两盘,则后面还有菜没吃,应标记 stop = true,最终输出 No
        • i=N1i = N-1,这对连续甜菜恰好是最后两盘,所有菜都已吃完,不触发停止。
      • 遍历结束后,根据 stop 输出 "Yes""No"
    3. 边界与细节

      • 最后一对连续甜菜的特殊处理i != N - 1 这个条件是关键。若忽略此条件,样例 2(sweet, salty, sweet, sweet)会被错误判定为 No
      • N=1N=1 的情况:只有一盘菜,不可能出现连续两盘甜菜,直接输出 Yes
      • N=2N=2 且两盘都是甜菜:此时 i=1=N1i=1 = N-1,属于最后一对,输出 Yes

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),仅需遍历一次所有菜。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        int N;
        cin >> N;
    
        string prev = "";          // 记录上一盘菜的口味
        bool stop = false;         // 是否已触发停止
        for (int i = 0; i < N; i++) {
            string s;
            cin >> s;
    
            // 如果之前已经停止,后续输入照读但不影响结果
            if (stop) {
                // 已停止吃菜,不再处理
            }
    
            // 核心判断:连续两盘甜菜,且不是最后一盘(吃完最后一盘后自然结束)
            if (prev == "sweet" && s == "sweet" && i != N - 1) {
                stop = true;
            }
    
            prev = s;              // 更新上一盘口味
        }
    
        cout << (stop ? "No" : "Yes") << endl;
    
        return 0;
    }
    
    • 1

    信息

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