1 条题解
-
0
📝 题目大意
有 盘菜按顺序吃,每盘要么是甜的(
sweet)要么是咸的(salty)。如果连续吃到两盘甜菜,高桥君就会停止吃后续的菜。判断他能否吃完所有 盘菜。💡 解题思路
-
题目分析:,数据量极小,直接模拟即可。关键在于理解"连续两盘甜菜就停止"的边界条件——如果最后两盘恰好都是甜菜,此时已经吃完所有菜,自然算作成功。
-
算法推导:
- 用
prev记录上一盘菜的口味,初始为空串。 - 用
stop标记是否已经触发了停止条件。 - 遍历每一盘菜 (),当
prev == "sweet"且s == "sweet"时,说明出现了连续两盘甜菜。此时需要判断当前位置 是否是最后一盘菜():- 若 ,即这对连续甜菜不是末尾两盘,则后面还有菜没吃,应标记
stop = true,最终输出No。 - 若 ,这对连续甜菜恰好是最后两盘,所有菜都已吃完,不触发停止。
- 若 ,即这对连续甜菜不是末尾两盘,则后面还有菜没吃,应标记
- 遍历结束后,根据
stop输出"Yes"或"No"。
- 用
-
边界与细节:
- 最后一对连续甜菜的特殊处理:
i != N - 1这个条件是关键。若忽略此条件,样例 2(sweet, salty, sweet, sweet)会被错误判定为No。 - 的情况:只有一盘菜,不可能出现连续两盘甜菜,直接输出
Yes。 - 且两盘都是甜菜:此时 ,属于最后一对,输出
Yes。
- 最后一对连续甜菜的特殊处理:
⏱️ 复杂度分析
- 时间复杂度:,仅需遍历一次所有菜。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (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
- 上传者